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 à, null
par 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.Empty
fonctionné?
La raison pour laquelle vous obtenez l'erreur est qu'elle Empty
est définie comme:
public static readonly Guid Empty;
Donc, c'est une variable, pas une constante (définie comme static readonly
non 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 const
de tout struct
, à la différence enum
par exemple. Si vous essayez, il ne se compilera pas.
La raison est encore une fois que ce struct
n'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 enum
gé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. Empty
est 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 const
valeur, 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 struct
s car vous ne pouvez pas modifier le struct
constructeur dans code).
Bien que vous puissiez fournir default
ou new
facilement, vous ne pouvez pas fournir un const
(car ce n'est pas un type primitif ou un enum
comme 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.