190 votes

Comment puis-je par défaut d’un paramètre à Guid.Empty en c# ?

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 :

255voto

Meligy Points 10138

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 structs 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.

151voto

Jon Skeet Points 692016

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:

  • Vous êtes vraiment appeler les sans paramètre du constructeur
  • Foo est une valeur de type

En 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.

18voto

Nick Points 9187

Si vous ne pouvez pas utiliser :

``?

11voto

Majix Points 71

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();
    }
}
 

4voto

Michael Kjörling Points 3939

Le compilateur est tout à fait correct ; ``n’est pas une constante de compilation. Vous pouvez essayer de faire une méthode de surcharge comme ceci :

Prograide.com

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.

Powered by:

X