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
Cette erreur se produit car List est une structure de données inscriptible. Si nous autorisons la conversion de List
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
Nous pouvons résoudre le problème de conversion en modifiant la méthode Play pour accepter un IEnumerable
<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!