Heim >Backend-Entwicklung >C++ >Kann ich einer Basisklassenliste in C#eine Liste abgeleiteter Klassenobjekte zuweisen?

Kann ich einer Basisklassenliste in C#eine Liste abgeleiteter Klassenobjekte zuweisen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-02-02 05:31:08675Durchsuche

Can I Assign a List of Derived Class Objects to a Base Class List in C#?

c# In der C# -Programmiersprache löst eine Liste der abgeleiteten Klassenobjekte in die Basisklassenreferenzliste das Problem der Zusammenarbeit aus. Dieses Problem tritt auf, wenn die abgeleitete Kategorie in der Basisklasse nicht vorhanden ist.

Betrachten Sie beispielsweise den folgenden Code:

In diesem Code wird die Liste des Giraffe -Objekts der von Tier verwiesenen Liste zugeordnet. Diese Zuordnung ist jedoch während der Zusammenstellung aufgrund des Koordinationsproblems fehlgeschlagen.
<code class="language-csharp">class Animal { }
class Giraffe : Animal { }

static void Main(string[] args)
{
    List<Giraffe> giraffes = new List<Giraffe>();
    List<Animal> animals = giraffes; // 编译时错误
}</code>

Zusammenarbeit und Nichtversorgung

Die generischen Typen von c #können koordiniert oder unverändert werden. Die Koordination ermöglicht es Basisklassenreferenzen, die abgeleiteten Klassenobjekte zu referenzieren, während die Nicht -Dezgeneration solche Zuordnungen verhindert. Für die Liste ist das Standardverhalten nicht -variabilität, was bedeutet, dass die Liste nicht der Liste

zugewiesen werden kann.

Lösung

Um dieses Problem zu lösen, gibt es mehrere Lösungen:

Explizite Konvertierung:

Der folgende Code kann verwendet werden, um die Liste

zu anzeigen, um
    :
  • aufzulisten Es wird jedoch nicht empfohlen, diese explizite Konvertierung zu verwenden, da die Konvertierung, wenn sie ungültig ist, Laufzeitfehler verursachen kann.
convertAll -Methode:
<code class="language-csharp">List<Animal> animals = (List<Animal>)giraffes; // 不推荐,可能导致运行时错误</code>
Sie können mit der Liste

.ConvertAll -Methode die Liste

verwenden, um
    zu konvertieren, indem Sie Lambda -Ausdrücke listen, die jedes Element konvertieren. Zum Beispiel:
  • Implementieren Sie die icovariante Schnittstelle
<code class="language-csharp">List<Animal> animals = giraffes.ConvertAll(g => (Animal)g);</code>
Es kann explizit angegeben werden, um die kollaborative Änderung generischer Typen über benutzerdefinierte Schnittstellen anzugeben. Durch die Implementierung der icovarianten
    -Schinnee kann die Klasse dem Objekt ermöglichen, die generische Art der genetischen Klasse zu verwenden, um die Zuordnung zu verweisen. (HINWEIS:
  • existiert in C#nicht, die tatsächliche Lösung besteht darin, zu verwenden, da List selbst die Koordination nicht unterstützt.) Änderung.

Welche Methode zu wählen, hängt von der spezifischen Situation und den Anforderungen für die Robustheit des Codes ab. Die -Methode ist normalerweise die erste Wahl, da sie sicherer ist und die Konvertierungsabsicht ausdrückt. Die Verwendung von entspricht eher dem Prinzip der generischen Programmierung und vermeidet das Risiko einer expliziten Umwandlung. ICovariant<out T>

Das obige ist der detaillierte Inhalt vonKann ich einer Basisklassenliste in C#eine Liste abgeleiteter Klassenobjekte zuweisen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn