C# renvoi d'un Enum? à partir d'une statique de la méthode d'extension

J'ai ajouté des méthodes d'extension pour les cordes pour rendre le travail avec quelques énumérations plus facile.

public static Enum ToEnum<T>(this string s)
{
    return (Enum)Enum.Parse(typeof(T), s);
}

public static bool IsEnum<T>(this string s)
{
    return Enum.IsDefined(typeof(T), s);
}

Remarque: en raison de limitations de type générique contraintes, je dois écrire les méthodes comme ci-dessus. J'aimerais utiliser T ToEnum(ce string s) où T: Enum pour éviter la fonte après avoir fait l'appel ... mais pas faire.

En tout cas, j'ai pensé qu'il serait agréable d'étendre ce concept un peu pour revenir Enum? dans les cas où une signature de méthode peut accepter divers nullable enums.

public static Enum? ToEnumSafe<T>(this string s)
{
    return (IsEnum<T>(s) ? (Enum)Enum.Parse(typeof(T), s) : null);
}

Cependant, ce n'est pas dû à des erreurs de compilation.

error CS0453: The type 'System.Enum' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'System.Nullable<T>'

Je dois admettre que je suis un peu confus, ici comme Enum? doit être légitime de la valeur de retour, non?. J'ai essayé quelque chose de similaire, mais à la fin avec la même erreur.

public static T? ToEnumSafe<T>(this string s)
{
    return (IsEnum<T>(s) ? (T)Enum.Parse(typeof(T), s) : null);
}

J'ai même décidé de le réécrire les méthodes pour enlever les génériques et je reçois plus de la même chose:

public static bool IsEnum(this string s, Type T)
{
    return Enum.IsDefined(T, s);
}
public static Enum? ToEnumSafe(this string s, Type T)
{
    return (IsEnum(s, T) ? (Enum)Enum.Parse(T, s) : null);
}

Ai-je raté quelque chose de vraiment stupide ici?

Ahh oui. Aujourd'hui, je vois mon erreur stupide. Enum est dérivé de ValueType qui lui-même est un Type de Référence que sa dérivée à partir de l'objet. Je pense que je dois avoir moins de matière grise dans le temps ;0 la confusion de La partie est qu'il n'y a rien qui empêche l'utilisation d'un béton de type enum -- ne pas faire sur une plus générique de mise en œuvre: public enum Test { a, b }; public static de la classe Testeur { public static Test? GetTest() { return (true == true ? (Test?)Test.un : null); } } Merci à tous les intervenants.

OriginalL'auteur Ethan J. Brown | 2009-10-12