Maison >développement back-end >C++ >Comment puis-je convertir une liste en liste en 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!