Konvertieren einer Liste abgeleiteter Klassen in eine Liste von Basisklassen in C#
Dieses Beispiel zeigt ein häufiges Problem: Übergabe einer Liste abgeleiteter Klassenobjekte (z. B. List<Cat>
) an eine Methode, die eine Liste von Basisklassenobjekten (List<Animal>
) erwartet. Eine direkte Zuweisung ist nicht zulässig, da ein Basisklassenverweis nicht direkt auf ein abgeleitetes Klassenobjekt verweisen kann.
Das Problem:
Der Versuch, ein List<Cat>
an eine Methode mit einem List<Animal>
-Parameter zu übergeben, führt zu einem Compilerfehler.
Die Lösung: Verwendung von IEnumerable
und Kovarianz
Die Lösung nutzt die generische Kovarianz von C#. Anstatt List<Animal>
zu verwenden, ändern Sie den Methodenparametertyp in IEnumerable<Animal>
. IEnumerable
ist eine schreibgeschützte Schnittstelle; Dadurch wird verhindert, dass die Methode die ursprüngliche Sammlung ändert, wodurch mögliche Bedenken hinsichtlich der Typsicherheit beseitigt werden.
Überarbeiteter Code:
<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>
Dies funktioniert, weil List<Cat>
implizit in IEnumerable<Cat>
konvertiert wird und IEnumerable<Cat>
mit IEnumerable<Animal>
kovariant ist. Die Play
-Methode kann jetzt sicher durch die Sammlung iterieren, ohne zu versuchen, sie zu ändern. Dieser Ansatz gewährleistet die Typsicherheit und ermöglicht gleichzeitig eine flexible Methodenparametrisierung.
Das obige ist der detaillierte Inhalt vonWie kann ich eine Liste in eine Liste in C# umwandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!