List
In C# kann es beim Umgang mit Vererbung und generischen Typen zu Situationen kommen, in denen Sie eine Liste abgeleiteter Klassenobjekte in eine Liste von Basisklassenobjekten konvertieren müssen. Dies kann zu Problemen führen, wenn die Basisklasse virtuelle Methoden enthält, die in der abgeleiteten Klasse überschrieben werden.
Betrachten Sie das folgende Beispiel:
<code class="language-csharp">class Animal { public virtual void Play(List<Animal> animals) { } } class Cat : Animal { public override void Play(List<Animal> animals) { // Cat 特定的实现 } } class Program { static void Main(string[] args) { Cat cat = new Cat(); cat.Play(new List<Cat>()); // 错误:参数 1 无法从“System.Collections.Generic.List<Cat>”转换为“System.Collections.Generic.List<Animal>” } }</code>
Beim Kompilieren dieses Codes wird die Fehlermeldung „Parameter 1: Konvertierung von ‚System.Collections.Generic.List
Um dieses Problem zu lösen, müssen Sie das Konzept der generischen Kovarianz verstehen. Mit der generischen Kovarianz können Sie den Typ eines Parameters in einer abgeleiteten Klassenüberschreibung sicher erweitern. In diesem Fall möchten Sie den Parametertyp von List
C# 4 führt mit Hilfe von IEnumerable
<code class="language-csharp">public virtual void Play(IEnumerable<Animal> animals) { }</code>
Dann überschreiben Sie es in der Cat-Klasse:
<code class="language-csharp">public override void Play(IEnumerable<Animal> animals) { }</code>
Sie können die Play-Methode kovariantensicher machen. Dadurch können Sie eine List
<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>
Dieser Code wird ohne Fehler kompiliert und ausgeführt, sodass Sie List< sicher konvertieren können, wenn eine Basisklassenmethode mit IEnumerable
Das obige ist der detaillierte Inhalt vonWie kann ich in C# sicher eine „Liste' in eine „Liste' umwandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!