web-dev-qa-db-fra.com

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'

37
Kirill Kovalenko

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

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

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

Ainsi:

Enum? bob = null;

ne compilera pas, et votre code non plus.

C'est vraiment étrange (puisque Enum lui-même est une classe, mais un Enum spécifique que vous définissez dans votre code est un struct) si vous ne l'avez pas rencontré auparavant , mais c'est clairement un class (pas un struct) selon docs et le code source.

16
mjwills