Lors de la transmission d'une liste de classes dérivées à une fonction qui s'attend à une liste de classes de base, les développeurs peuvent rencontrer l'erreur:
cannot convert from 'System.Collections.Generic.List<ConsoleApplication1.DerivedClass>' to 'System.Collections.Generic.List<ConsoleApplication1.BaseClass>'
Cette erreur n'est pas immédiatement intuitive, car on peut supposer qu'une liste de classes dérivées devrait être compatible avec une liste de classes de base. Pour comprendre la raison de cette restriction, il est essentiel de saisir le concept de covariance dans les collections génériques.
covariance et invariance
collections génériques de collections génériques en C # peut être covariant ou invariant. Les collections covariantes permettent la substitution de types dérivés pour leurs types de base, tandis que les collections invariantes ne le font pas.
LISTE & LT; T & GT; est un exemple de collection invariant . Cela signifie qu'une liste & lt; DerivedClass & gt; ne peut pas être attribué à une liste & lt; Baseclass & gt; Parce que le compilateur garantit que tous les éléments d'une liste seront toujours du type déclaré T.
implications de l'invariance pour la liste & lt; t & gt;
l'invariance de la liste & lt; T & gt; protège contre les opérations non valides qui pourraient violer la sécurité du type. Par exemple, si une liste & lt; Baseclass & gt; est attribué à une liste & lt; DeriveClass & gt;, des instances de classe dérivées pourraient potentiellement être remplacées par des instances de classe de base, conduisant à des comportements inattendus.
Alternative sûre: ienumberable & lt; t & gt;
Pour passer en toute sécurité une liste de classes dérivées à une fonction qui s'attend à une liste de classes de base, les développeurs peuvent utiliser ienumerable & lt; t & gt; , qui est covariant . Cela permet la substitution de types dérivés pour les types de base, en résolvant le problème de conversion sans compromettre la sécurité des types.
Dans l'extrait de code fourni, la modification suivante traite de l'erreur:
IEnumerable<BaseClass> bcl = new List<DerivedClass>(); public void doSomething(IEnumerable<BaseClass> bc) { // do something with bc }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!