Heim >Backend-Entwicklung >C++ >Warum schlägt die Listeninitialisierung mit einem generischen offenen Typ in C# fehl?
C# Generic Open Type List-Initialisierungsfehler: Eine Lösung
Bei der Arbeit mit generischen offenen Typen wie Data<T>
und ihren geschlossenen konstruierten Typen (z. B. StringData
, DecimalData
) führt der Versuch, eine Liste mit List<Data>
zu erstellen, zu einem Compilerfehler: „Der generische Typ wird verwendet.“ „Daten“ erfordert Argumente vom Typ 1.“ Dies liegt daran, dass C# den Diamantoperator für offene generische Typen nicht unterstützt. Es ist immer ein konkretes Typargument erforderlich.
Das Problem erklärt
Der Compiler muss den spezifischen Typ innerhalb der Data<T>
-Klasse kennen, um eine Liste zu erstellen. List<Data>
ist mehrdeutig; Es wird nicht angegeben, welchen Typ T
darstellt.
Effektive Lösungen
Hier sind zwei praktische Ansätze, um dieses Problem zu lösen:
Schnittstellenimplementierung: Erstellen Sie eine Schnittstelle (z. B. IData
), die Data<T>
und ihre abgeleiteten Typen implementieren. Dann deklarieren Sie Ihre Liste als List<IData>
. Dadurch wird Polymorphismus genutzt, sodass Sie Instanzen verschiedener Data<T>
-Typen in derselben Liste speichern können.
Abstrakte Basisklasse: Definieren Sie eine abstrakte Basisklasse (z. B. DataBase
) für Data<T>
. Leiten Sie Ihre konkreten Typen von dieser Basisklasse ab. Anschließend können Sie eine Liste mit List<DataBase>
erstellen. Dies sorgt für eine starke Typisierung, jedoch mit weniger Generizität im Vergleich zum Schnittstellenansatz.
Überlegungen
Beide Methoden bringen eine gewisse Designkomplexität mit sich. Die Wahl hängt von den spezifischen Anforderungen Ihrer Anwendung ab. Schnittstellen bieten eine größere Flexibilität, während abstrakte Basisklassen einen strukturierteren Ansatz bieten.
Weiterführende Literatur
Für ein tieferes Verständnis von Generika, Varianz und Polymorphismus in C# lesen Sie diese Ressourcen:
Das obige ist der detaillierte Inhalt vonWarum schlägt die Listeninitialisierung mit einem generischen offenen Typ in C# fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!