Abgeleitete Klassenliste in Basisklassenliste konvertieren
Kovarianz bedeutet, dass ein abgeleiteter Typ seinen Basistyp ersetzen kann, ohne Funktionalität zu verlieren. In diesem Fall haben wir eine Basisklasse (Animal) und eine abgeleitete Klasse (Cat), wobei die Basisklasse eine virtuelle Methode Play enthält, die eine Liste als Eingabeparameter akzeptiert.
Der folgende Code veranschaulicht das Konvertierungsproblem:
<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>
Das Kompilieren des Codes führt zu folgendem Fehler: Argument 1: Kann nicht von „System.Collections.Generic.List
Dieser Fehler tritt auf, weil List eine beschreibbare Datenstruktur ist. Wenn wir die Konvertierung von List
Um dieses Problem zu lösen, führte C# 4 ein Konzept namens „generische Kovarianz“ für bekanntermaßen sichere Schnittstellen ein. IEnumerable
Wir können das Konvertierungsproblem lösen, indem wir die Play-Methode so ändern, dass sie ein 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>
Durch die Verwendung der IEnumerable<T>
-Schnittstelle anstelle von List<T>
nutzen wir die Kovarianzfunktion von C#, vermeiden Typkonvertierungsfehler und gewährleisten die Sicherheit des Codes. IEnumerable<T>
ermöglicht nur das Lesen, nicht das Ändern von Daten, daher ist die Konvertierung von List<Cat>
in IEnumerable<Animal>
sicher.
Das obige ist der detaillierte Inhalt vonKann ich in C# eine „Liste' in eine „Liste' umwandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!