Maison > développement back-end > C++ > Puis-je convertir une « liste » en « liste » en C# ?

Puis-je convertir une « liste » en « liste » en C# ?

Patricia Arquette
Libérer: 2025-01-09 22:32:47
original
294 Les gens l'ont consulté

Can I Cast a `List` to a `List` in C#?

Convertir la liste de classes dérivées en liste de classes de base

La covariance signifie qu'un type dérivé peut remplacer son type de base sans perdre aucune fonctionnalité. Dans ce cas, nous avons une classe de base (Animal) et une classe dérivée (Cat), où la classe de base contient une méthode virtuelle Play qui accepte une liste comme paramètre d'entrée.

Le code suivant illustre le problème de conversion :

<code class="language-csharp">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication9
{
    class Animal
    {
        public virtual void Play(List<Animal> animals) { }
    }
    class Cat : Animal
    {
        public override void Play(List<Animal> animals)
        {
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat();
            cat.Play(new List<Cat>());
        }
    }
}</code>
Copier après la connexion

La compilation du code entraînera l'erreur : Argument 1 : impossible de convertir de 'System.Collections.Generic.List' en 'System.Collections.Generic.List'.

Cette erreur se produit car List est une structure de données inscriptible. Si nous autorisons la conversion de List en List, les chiens peuvent être ajoutés à la liste des chats, ce qui peut entraîner un comportement inattendu.

Pour résoudre ce problème, C# 4 a introduit un concept appelé « covariance générique » pour les interfaces connues et sûres. IEnumerable est une telle interface. Puisque IEnumerable n'autorise pas la mutation, il est considéré comme sûr du point de vue covariant.

Nous pouvons résoudre le problème de conversion en modifiant la méthode Play pour accepter un IEnumerable au lieu d'un List :

<code class="language-csharp">class Animal
{
    public virtual void Play(IEnumerable<Animal> animals) { }
}
class Cat : Animal
{
    public override void Play(IEnumerable<Animal> animals) { }
}
class Program
{
    static void Main()
    {
        Cat cat = new Cat();
        cat.Play(new List<Cat>());
    }
}</code>
Copier après la connexion

En utilisant l'interface IEnumerable<T> au lieu de List<T>, nous profitons de la fonctionnalité de covariance de C#, évitons les erreurs de conversion de type et garantissons la sécurité du code. IEnumerable<T> permet uniquement aux données d'être lues, non modifiées, il est donc sûr de convertir List<Cat> en IEnumerable<Animal>.

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