cela a vraiment à voir avec les types ouverts construits.
Quand vous dites:
class List<T> : IList<T>
Vous êtes en train de dire: ma classe est appelée Liste, il a un paramètre de type appelé T, et il implémente l'interface qui est construit à partir IList <> en utilisant la même T. Ainsi, le T dans la partie définition et le T dans la partie "implémente" font tous deux référence au même paramètre de type - vous le déclarez avant le signe deux-points, puis vous le référenciez immédiatement après le signe deux-points.
Cela devient confus car le paramètre de type IList<>
est également appelé T - mais c'est un paramètre de type différent entièrement. Donc, nous allons re-proclamons notre classe concrète comme ceci:
class List<U> : IList<U>
Ceci est tout à fait équivalent à ce qui précède, que maintenant nous pouvons dire « U » lorsque l'on se réfère au paramètre de type de liste, et T lorsque nous parlons de celui de IList. Ils sont différents types.
Maintenant, il devient plus facile de voir pourquoi la définition de type générique List<U>
(qui est ce que vous voulez dire quand vous dites typeof(List<>)
) ne met pas en œuvre la définition de type generifc IList<T>
(qui est ce que vous voulez dire quand vous dites typeof(IList<>)
), mais plutôt implémente le type construit générique ouvert IList<U>
(c'est-à-dire, IList construit avec le propre type de parémètre de List). Donc, fondamentalement, les définitions de types génériques n'héritent ou n'implémentent jamais d'autres définitions de types génériques - elles implémentent généralement des types construits ouverts en utilisant leurs propres paramètres de type avec d'autres définitions de types génériques.
La réponse de Ripper234 montre comment gérer ce cas particulier en utilisant Reflection, donc je ne vais pas le répéter; Je voulais juste clarifier la relation entre ces types, et j'espère que cela est sorti au moins quelque peu intelligible.
Cela fonctionne pour ce cas particulier, mais il manquera des choses comme MyIntList etc. comme indiqué dans la réponse de Jon. J'ai posté une autre réponse ci-dessous pour essayer d'expliquer la relation. – Avish