Solution
Vous pouvez utiliser à la new Guid()place
public void Problem(Guid optional = new Guid())
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
Vous pouvez aussi utiliser default(Guid)
default(Guid)fonctionnera également exactement comme new Guid().
Étant donné que Guid est un type valeur et non un type référence, il default(Guid)n'est donc pas égal à, nullpar exemple, il est égal à l'appel du constructeur par défaut.
Ce qui signifie que ceci:
public void Problem(Guid optional = default(Guid))
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
C'est exactement le même que l'exemple original.
Explication
Pourquoi n'a pas Guid.Emptyfonctionné?
La raison pour laquelle vous obtenez l'erreur est qu'elle Emptyest définie comme:
public static readonly Guid Empty;
Donc, c'est une variable, pas une constante (définie comme static readonlynon comme const). Le compilateur ne peut avoir que des valeurs connues du compilateur comme valeurs par défaut des paramètres de méthode (non connues uniquement à l'exécution).
La cause racine est que vous ne pouvez pas avoir constde tout struct, à la différence enumpar exemple. Si vous essayez, il ne se compilera pas.
La raison est encore une fois que ce structn'est pas un type primitif.
Pour une liste de tous les types primitifs dans .NET, voir http://msdn.microsoft.com/en-gb/library/system.typecode.aspx
(notez que enumgénéralement hérite int, qui est une primitive)
Mais ce new Guid()n'est pas non plus une constante!
Je ne dis pas qu'il faut une constante. Il a besoin de quelque chose qui peut être décidé au moment de la compilation. Emptyest un champ, donc sa valeur n'est pas connue au moment de la compilation (seulement au tout début de l'exécution).
La valeur du paramètre par défaut doit être connue au moment de la compilation, qui peut être une constvaleur, ou quelque chose de défini à l'aide d'une fonctionnalité C # qui rend la valeur connue au moment de la compilation, comme default(Guid)ou new Guid()(qui est décidé au moment de la compilation pour structs car vous ne pouvez pas modifier le structconstructeur dans code).
Bien que vous puissiez fournir defaultou newfacilement, vous ne pouvez pas fournir un const(car ce n'est pas un type primitif ou un enumcomme expliqué ci-dessus). Donc, encore une fois, ne pas dire que le paramètre facultatif lui-même a besoin d'une constante, mais une valeur connue du compilateur.