Je comprends généralement les interfaces, l'héritage et le polymorphisme, mais une chose m'a perplexe.
Dans cet exemple, Cat Strong> Implements Ianimal Strong> et bien sûr strong> implémente ilist fort>: p> mais il génère une erreur de compilation (ne peut pas convertir implicitement le type ...) em >. Cela ne fonctionnera pas non plus si j'utilise une superclasse d'As fusque [animal] que le chat hérite de. Cependant, si je remplace ianimal fort> avec il compile bien. P> in mon esprit, parce que Quelqu'un peut-il expliquer pourquoi ce n'est pas valide? Je suis sûr qu'il y a une explication logique. P> p>
6 Réponses :
Ce type de Covariance n'est pas pris en charge en C # 4.0. Il est raisonnable d'attendre le comportement que vous voulez, il n'est tout simplement pas pris en charge (pour l'instant). P>
Pouvez-vous clarifier? Covariance et Contravariance sont soutenus dans C # 4.0, mais ilist
Haha, eh bien, Eric Lippert vient de répondre, alors je pense que cela en résume: D
Vous pouvez atteindre cela à l'aide de LINQ:
IList<IAnimal> cats = new List<Cat>().Cast<IAnimal>();
c # ne prend pas en charge ce type de variance sur Si C # a soutenu cela, que vous attendriez-vous ici? P > en C # 4 Vous pouvez faire quelque chose comme ceci: p> ceci est parce que le ilist
ienumerable < T> code> interface prend en charge la variance de ce type. Un
ienumerable
écureuil code> sur un < Code> IEnumerable
chat code>. p> p>
Il y a une explication logique, et cette question exacte est posée à peu près tous les jours sur Stackoverflow.
Supposons que c'était légal: P>
IEnumerable<IAnimal> cats = new List<Cat>();
Merci Eric. Je vais certainement lire vos articles. Toutes mes excuses de poser une question continuellement répétée ... feront une recherche bien meilleure recherche la prochaine fois.
@Mark: De rien, et pas de soucis; Le fait que cette question soit posée autant est l'une des choses qui ont motivé l'ajout de la fonctionnalité au C # 4 en premier lieu. Il est clair que les gens ont une intuition que la variance générique devrait faire partie du système de type. Maintenant, il s'agit simplement d'éduquer les gens sur quels types de variance sont prudemment sûrs.
Une mise à jour. J'ai maintenant lu des articles d'Eric et ils éclairent parfaitement la covariance de la covariance. Je lis également la section à ce sujet en C # en profondeur par Jon Skeet, qui fournit un bon résumé aussi (et des tactiques pour faire face à la covariance et à la contrevenance). Quelqu'un d'autre qui luttant avec le concept ne devrait pas ne chercher plus loin que ces deux ressources à mon avis. Merci à tous ceux qui ont offert des conseils.
Par exemple, si dans votre exemple: p>
Vous vouliez ajouter un nouveau chat, des chats, cela permettrait: p>
supposer que le chien a également mis en œuvre Ianimal, c'est évidemment incorrect et ne fonctionnerait pas. C'est pourquoi il n'est pas une interface covariante ou contrevenariant. P> IList
ilist
T code> comme paramètre et le renvoie comme une valeur de retour des méthodes, ce qui rend la problématique de la covariance. P>
ilist
chats.add (nouveau chien ()); code> p>
Si vous avez besoin de covariance et de cravarariance sur une interface de liste, vous devez définir une interface IREADRABLELIST