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
Patricia Arquetteoriginal
2025-01-09 22:32:47370parcourir

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>

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>

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!

Déclaration:
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