2010-11-19 3 views
4

J'ai la fonction générique suivante:Restriction de fonction générique au travail que sur énumérations

public SomeType SomeFunction<T>(T value) 
{ 
} 

Je voudrais maintenant limiter cette fonction générique pour fonctionner uniquement avec Enum s donc j'essayé ce qui suit:

public SomeType SomeFunction<T>(T value) where T : System.Enum 
{ 
} 

Mais ce résultat:

erreur CS0702: contrainte ne peut pas être s pecial class 'System.Enum'

Y at-il un travail autour et par curiosité quelqu'un connaît-il la raison pour laquelle ce type de contrainte n'est pas autorisé?

+0

Vous devriez jeter un oeil à la réponse acceptée dans la dupe mentionnée par Ani. C'est une restriction du langage C#, pas du CLR (par exemple, il est possible de contraindre 'enum' dans F #). La bibliothèque Melody Unconstrained fournit une solution de contournement pour autoriser les contraintes 'enum' dans C# lui-même: http://code.google.com/p/unconstrained-melody/ – LukeH

Répondre

5

Vous ne pouvez pas. Vous pouvez le restreindre aux types de valeur, mais c'est tout. La restriction à énumérations ne peut être fait en utilisant le contrôle d'exécution:

public SomeType SomeFunction<T>(T value) where T : struct 
{ 
    if (!typeof(T).IsEnum) 
    { 
     throw new NotSupportedException("Only enums are supported."); 
    } 
} 
+1

+1. Il est également intéressant de noter que System.Enum n'est pas une énumération. –

+0

Le problème est que j'ai une autre fonction, non générique, avec le même nom qui n'est pas appelée maintenant parce que tous les appels 'SomeFunction' sont routés vers la version générique, gah! –

+0

Vous pouvez réellement rendre la contrainte un peu plus serrée aussi, pas que cela aide vraiment beaucoup: 'où T: struct, IComparable, IConvertible, IFormattable' – LukeH

1

Steven est correct, mais vous pouvez le réduire un peu avant de jeter une exception

public SomeType SomeFunction<T>(T value) where T : struct 
+2

C'est moins que ce que Steven a dit. -1 –

+1

Le -1 n'est pas mérité, parce que j'ai édité ma réponse pour ajouter le 'où T: struct' plus tard. Cette édition a probablement traversé ce post. – Steven

+0

Ok, mais (selon le chronométrage du SO) vous avez répondu 5 minutes après Steven. Vous devez tous les deux avoir fait des modifications de ninja si vous dites que votre réponse a plus d'informations que celle de Steven à un moment donné, parce que je ne peux voir aucune modification à l'une ou l'autre des réponses. Désolé si c'est le cas. –

Questions connexes