Liste
Bei der Vererbung ist es manchmal notwendig, eine Liste abgeleiteter Klassenobjekte in eine Liste von Basisklassenobjekten umzuwandeln. Dies kann jedoch bei unsachgemäßer Handhabung zu Fehlern führen.
Fehler bei der Listenkonvertierung mit beschreibbaren Daten
Bedenken Sie den folgenden Code:
<code class="language-c#">using System; using System.Collections.Generic; class Animal { public virtual void Play(List<Animal> animal) { } } class Cat : Animal { public override void Play(List<Animal> animal) { } } class Program { static void Main(string[] args) { Cat cat = new Cat(); cat.Play(new List<Cat>()); } }</code>
Dieser Code generiert einen Kompilierungsfehler aufgrund einer Nichtübereinstimmung der Listenobjekttypen. Animal erwartet eine Liste seines eigenen Typs (Animal), diese Methode wird jedoch mit einer Liste von Cat-Objekten aufgerufen.
Fehlergrund
Dieser Fehler tritt auf, weil die Liste beschreibbar ist. Wenn die Konvertierung zulässig ist, kann es zu Problemen bei der Datenmanipulation kommen. Beispielsweise könnte ein Hundeobjekt zu einer Katzenliste hinzugefügt werden, was gegen die Typensicherheit verstoßen würde.
Generische Kovarianz
In C# 4 wurde eine Funktion namens generische Kovarianz eingeführt. Dadurch kann eine Liste abgeleiteter Klassen in eine Liste von Basisklassen konvertiert werden, sofern diese Typen die Typsicherheit gewährleisten. Ein Beispiel für einen sicheren Typ für generische Kovarianz ist IEnumerable<T>
, der eine Folge von Objekten darstellt, in die jedoch nicht geschrieben werden kann.
Implementierung generischer Kovarianz
Um generische Kovarianz zu implementieren, können Sie die Methodensignatur in der Basisklasse ändern, um IEnumerable<T>
als Parametertyp zu verwenden, etwa so:
<code class="language-c#">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>
In diesem Beispiel verwendet die Play-Methode in Animal IEnumerable<Animal>
als Parameter, der es ihr ermöglicht, eine Sequenz von Animal- und Cat-Objekten zu akzeptieren.
Das obige ist der detaillierte Inhalt vonWie kann ich eine Liste in C# sicher in eine Liste umwandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!