554 votes

Pourquoi ne c# interdit aux types d’attributs génériques ?

Cela provoque une exception de compilation :

Je sais que c# ne supporte pas les attributs génériques. Cependant, après beaucoup de googler, je n’arrive à trouver la raison.

Quelqu'un sait-il pourquoi les types génériques ne peut pas dériver de `` ? Les théories ?

383voto

Jon Skeet Points 692016

Eh bien, je ne peux pas répondre pourquoi il n'est pas disponible, mais je peux confirmer que ce n'est pas un CLI question. Les spécifications CLI n'en parle pas (aussi loin que je peux voir) et si vous utilisez de IL directement, vous pouvez créer un générique de l'attribut. La partie du C# 3 spec qui le leur interdit - section 10.1.4 "Classe de spécification de base" ne pas donner la moindre justification.

Le annoté ECMA C# 2 spec ne donnent pas toutes les informations utiles, bien qu'il n'fournir un exemple de ce qui n'est pas autorisé.

Mon exemplaire de la annoté C# 3 spec devrait arriver demain... je vais voir si cela donne plus d'informations. De toute façon, c'est certainement une langue plutôt que de l'exécution.

EDIT: Réponse de Eric Lippert (paraphrasé): pas de raison particulière, sauf pour éviter la complexité à la fois la langue et le compilateur pour un cas d'utilisation qui permet de ne pas ajouter beaucoup de valeur.

93voto

GalacticCowboy Points 8185

Un attribut décore une classe au moment de la compilation, mais une classe générique n’a pas reçu ses informations de type final avant l’exécution. Étant donné que l’attribut peut affecter la compilation, il doit être « complète » au moment de la compilation.

Voir cet article MSDN pour plus d’informations.

22voto

GeekyMonkey Points 5036

Je ne sais pas pourquoi il n’est pas autorisé, mais il s’agit d’une solution de contournement possible

18voto

nawfal Points 13500

Ce n’est pas vraiment générique et vous devez toujours écrire la classe d’attributs spécifiques par type, mais vous pouvez être en mesure d’utiliser une interface de base générique pour coder un peu défensive, écrire le moindre code celui requis dans le cas contraire, obtenir des avantages du polymorphisme, etc..

7voto

ichiban Points 4568

C'est une très bonne question. Dans mon expérience avec les attributs, je pense que la contrainte est en place parce que lors de la réflexion sur un attribut qu'il créerait une situation dans laquelle vous devez vérifier pour tout type de permutations: typeof(Validates<string>), typeof(Validates<SomeCustomType>), etc...

À mon avis, si une validation personnalisée est nécessaire en fonction du type de l'attribut ne peut pas être la meilleure approche.

Peut-être une validation de classe qui prend en SomeCustomValidationDelegate ou ISomeCustomValidator comme un paramètre serait une meilleure approche.

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