Maison >développement back-end >C++ >Comment puis-je convertir une liste en liste en C# ?

Comment puis-je convertir une liste en liste en C# ?

DDD
DDDoriginal
2025-01-09 22:41:41386parcourir

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

Conversion d'une liste de classes dérivées en une liste de classes de base en C#

Cet exemple illustre un problème courant : transmettre une liste d'objets de classe dérivés (par exemple, List<Cat>) à une méthode attendant une liste d'objets de classe de base (List<Animal>). L'affectation directe n'est pas autorisée car une référence de classe de base ne peut pas pointer directement vers un objet de classe dérivé.

Le problème :

Tenter de passer un List<Cat> à une méthode avec un paramètre List<Animal> entraîne une erreur du compilateur.

La solution : utiliser IEnumerable et Covariance

La solution exploite la covariance générique de C#. Au lieu d'utiliser List<Animal>, modifiez le type de paramètre de méthode en IEnumerable<Animal>. IEnumerable est une interface en lecture seule ; cela empêche la méthode de modifier la collection d'origine, répondant ainsi à des problèmes potentiels de sécurité de type.

Code révisé :

<code class="language-csharp">class Animal
{
    public virtual void Play(IEnumerable<Animal> animals) { }
}

class Cat : Animal
{
    public override void Play(IEnumerable<Animal> animals)
    {
        //Implementation
    }
}

class Program
{
    static void Main()
    {
        Cat myCat = new Cat();
        myCat.Play(new List<Cat>()); // This now compiles successfully
    }
}</code>

Cela fonctionne parce que List<Cat> se convertit implicitement en IEnumerable<Cat>, et IEnumerable<Cat> est covariant avec IEnumerable<Animal>. La méthode Play peut désormais parcourir la collection en toute sécurité sans tenter de la modifier. Cette approche maintient la sécurité des types tout en permettant un paramétrage flexible des méthodes.

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