Je tiens à dire :
Mais le compilateur se plaint que Guid.Empty n’est pas une constante de temps de compilation.
Comme je ne souhaite pas changer l’API, je ne peux pas utiliser :
Je tiens à dire :
Mais le compilateur se plaint que Guid.Empty n’est pas une constante de temps de compilation.
Comme je ne souhaite pas changer l’API, je ne peux pas utiliser :
Font new Guid()
à la place.
public void Problem(Guid optional = new Guid())
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
Solution Alternative:
default(Guid)
également fonctionnera exactement comme new Guid()
.
Parce que le Guid est un type de valeur de référence pas de type, de sorte que, default(Guid)
n'est pas égal à null
par exemple, au lieu de cela, elle est égale à l'appel de constructeur par défaut.
Ce qui signifie que cela:
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'original exemple.
Cause:
La raison pour laquelle vous obtenez l'erreur est parce qu' Empty
est défini comme:
public static readonly Guid Empty;
Donc, c'est une variable, pas une constante (défini comme l' static readonly
pas comme const
). Le compilateur ne peut avoir compilateur connu valeurs des paramètres de la méthode des valeurs par défaut (pas uniquement à l'exécution connue).
La cause est que vous ne pouvez pas avoir un const
de struct
, contrairement aux enum
par exemple. Si vous l'essayez, il ne compile pas.
La raison une fois de plus, c'est qu' struct
n'est pas un type primitif.
Pour une liste de tous les types de primitives .NET voir http://msdn.microsoft.com/en-gb/library/system.typecode.aspx
(à noter qu' enum
habituellement hérite int ou similaire).
Explication:
Je ne dis pas qu'il a besoin d'une constante. Il a besoin de quelque chose qui peut être décidé au moment de la compilation. Empty
est un champ, donc, c'est la valeur n'est pas connue au moment de la compilation (seulement au début de temps d'exécution).
Valeur de paramètre par défaut doit être connu au moment de la compilation, ce qui peut être un const
de la valeur, ou quelque chose de défini à l'aide de C# fonction qui permet de la valeur connue au moment de la compilation, comme default(Guid)
ou new Guid()
(ce qui est décidé au moment de la compilation pour struct
s que vous ne pouvez pas modifier l' struct
constructeur dans le code).
Alors que vous pouvez fournir de l' default
ou new
facilement, vous ne pouvez pas fournir un const
(parce que c'est pas un type primitif ou d'un enum
comme expliqué ci-dessus). Donc, encore une fois, il ne dit pas que le paramètre facultatif elle-même a besoin d'une constante, mais le compilateur valeur connue.
Guid.Empty
est équivalent à new Guid()
, ce qui est équivalent à default(Guid)
. De sorte que vous pouvez utiliser:
public void Problem(Guid optional = default(Guid))
ou
public void Problem(Guid optional = new Guid())
Notez que l' new Foo()
de la valeur est uniquement applicable lorsque:
Foo
est une valeur de typeEn d'autres termes, lorsque le compilateur sait que c'est vraiment juste la valeur par défaut pour le type :)
(En fait, je suis à 99,9% sûr qu'il ne sera pas appeler n'importe quel personnalisée new Foo()
constructeur, vous avez créé. Vous ne pouvez pas créer un tel constructeur dans un type de valeur en C#, mais vous pouvez le faire en IL.)
Vous pouvez utiliser l' default(Foo)
option pour tout type.
La réponse acceptée ne fonctionne pas dans ASP.NET MVC et provoque cette erreur d'exécution:
[ArgumentException: The parameters dictionary contains a null entry for parameter 'optional' of non-nullable type 'System.Guid' for method 'System.Web.Mvc.ActionResult Problem(System.Guid)' ....
Au lieu de cela, vous pouvez effectuer les opérations suivantes:
public void Problem(Guid? optional)
{
if (optional == null)
{
optional = new Guid();
}
}
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.