Maison >développement back-end >C++ >Puis-je attribuer une liste d'objets de classe dérivés à une liste de classe de base en C #?
Par exemple, considérez le code suivant:
Dans ce code, la liste de l'objet girafe est attribuée à la liste référencée par l'animal. Cependant, cette affectation a échoué pendant la compilation en raison du problème de coordination.
<code class="language-csharp">class Animal { } class Giraffe : Animal { } static void Main(string[] args) { List<Giraffe> giraffes = new List<Giraffe>(); List<Animal> animals = giraffes; // 编译时错误 }</code>
coopération et non -varabilité
Les types génériques C # peuvent être coordonnés ou inchangés. La coordination permet des références de classe de base pour référence aux objets de classe dérivés, tandis que la non-dégénération empêche de telles affectations. Pour la liste, le comportement par défaut est la non-variabilité, ce qui signifie que la liste ne peut pas être affectée à la liste
.
Afin de résoudre ce problème, il existe plusieurs solutions:
Conversion explicite:Le code suivant peut être utilisé pour afficher la liste
pour lister<code class="language-csharp">List<Animal> animals = (List<Animal>)giraffes; // 不推荐,可能导致运行时错误</code>Vous pouvez utiliser la méthode List
.convertall pour convertir la liste
pour la liste<code class="language-csharp">List<Animal> animals = giraffes.ConvertAll(g => (Animal)g);</code>Il peut être explicitement spécifié pour spécifier le changement collaboratif des types génériques via des interfaces personnalisées. En implémentant l'interface icovariant
La méthode à choisir dépend de la situation spécifique et des exigences pour la robustesse du code. La méthode ICovariant<out T>
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!