65 votes

C # 7.3 Contrainte d'énumération: pourquoi ne puis-je pas utiliser l'énumération nullable?

Maintenant que nous avons une contrainte enum, pourquoi le compilateur ne me permet-il pas d'écrire ce code?

 public static TResult? ToEnum<TResult>(this String value, TResult? defaultValue)
    where TResult : Enum
{
    return String.IsNullOrEmpty(value) ? defaultValue : (TResult?)Enum.Parse(typeof(TResult), value);
}
 

Le compilateur dit:

Erreur CS0453 Le type 'TResult' doit être un type de valeur non nullable afin de l'utiliser comme paramètre 'T' dans le type ou la méthode générique 'Nullable'

108voto

Patrick Hofman Points 22166

Vous pouvez, mais vous devez ajouter une autre contrainte: la contrainte struct .

 public static void DoSomething<T>(T? defaultValue) where T : struct, Enum
{
}
 

20voto

mjwills Points 1114

Parce qu' System.Enum est une classe, vous ne pouvez pas déclarer une variable de type Nullable<Enum> (depuis Nullable<T> n'est possible que si T est struct).

Donc:

Enum? bob = null;

ne compile pas, ni votre code.

C'est certainement étrange (depuis Enum lui-même est une classe, mais un spécifique Enum que vous définissez dans votre code est un struct) si vous n'avez pas rencontré avant, mais c'est clairement un class (pas un struct) que par les docs et le code source.

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