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 #?

Puis-je attribuer une liste d'objets de classe dérivés à une liste de classe de base en C #?

Mary-Kate Olsen
Libérer: 2025-02-02 05:31:08
original
701 Les gens l'ont consulté

Can I Assign a List of Derived Class Objects to a Base Class List in C#?

C # Dans le langage de programmation C #, une liste d'objets de classe dérivée à la liste de référence de classe de base déclenchera le problème de la collaboration. Ce problème se produit lorsque la catégorie dérivée n'existe pas dans la classe de base.

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

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

.

Solution

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
    :
  • Cependant, il n'est pas recommandé d'utiliser cette conversion explicite, car si la conversion n'est pas valide, cela peut entraîner des erreurs d'exécution.
Méthode Convertall:
<code class="language-csharp">List<Animal> animals = (List<Animal>)giraffes; // 不推荐,可能导致运行时错误</code>
Copier après la connexion
Vous pouvez utiliser la méthode List

.convertall pour convertir la liste

pour la liste
    en fournissant des expressions lambda qui convertissent chaque élément. Par exemple:
  • Implémentez l'interface icovariant
<code class="language-csharp">List<Animal> animals = giraffes.ConvertAll(g => (Animal)g);</code>
Copier après la connexion
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 classe peut permettre à l'objet d'utiliser le type générique de classe génétique pour référencer l'affectation. (Remarque:
  • n'existe pas dans C #, la solution réelle consiste à utiliser , car la liste elle-même ne prend pas en charge la coordination.) Modifier.

La méthode à choisir dépend de la situation spécifique et des exigences pour la robustesse du code. La méthode est généralement le premier choix, car il est plus sûr et exprime l'intention de conversion. L'utilisation de est plus conforme au principe de la programmation générique, évitant le risque de conversion explicite. 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!

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