Maison > développement back-end > C++ > Pourquoi ne puis-je pas convertir une «liste» en une «liste» en C #?

Pourquoi ne puis-je pas convertir une «liste» en une «liste» en C #?

Susan Sarandon
Libérer: 2025-01-30 13:06:11
original
706 Les gens l'ont consulté

Why Can't I Convert a `List` to a `List` in C#?

Liste d'invariante: Comprendre la restriction de conversion

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>'
Copier après la connexion

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
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal