Wenn eine Liste abgeleitete Klassen an eine Funktion übergeben wird, die eine Liste von Basisklassen erwartet, können Entwickler auf den Fehler stoßen:
cannot convert from 'System.Collections.Generic.List<ConsoleApplication1.DerivedClass>' to 'System.Collections.Generic.List<ConsoleApplication1.BaseClass>'
Dieser Fehler ist nicht sofort intuitiv, da man annehmen könnte, dass eine Liste der abgeleiteten Klassen mit einer Liste von Basisklassen kompatibel sein sollte. Um den Grund für diese Einschränkung zu verstehen, ist es wichtig, das Konzept der -Kovarianz in generischen Sammlungen zu erfassen. In C# kann entweder kovarianten oder invariant sein. Kovariante Sammlungen ermöglichen die Substitution abgeleiteter Typen für ihre Basistypen, während invariante Sammlungen nicht.
list & lt; t & gt; ist ein Beispiel für eine invariante Sammlung. Dies bedeutet, dass eine Liste & lt; abgeleitete Klasse & gt; kann einer Liste nicht zugewiesen werden & lt; BaseClass & gt; Da der Compiler garantiert, dass alle Elemente in einer Liste immer vom deklarierten Typ T.
Auswirkungen der Invarianz für die Liste & lt; t & gt; T & gt; schützt vor ungültigen Operationen, die die Sicherheit der Typ verletzen könnten. Zum Beispiel, wenn eine Liste & lt; BaseClass & gt; wird einer Liste zugeordnet und abgeleitete Klasseninstanzen abgeleitet werden möglicherweise durch Basisklasseninstanzen ersetzt werden, was zu unerwarteten Verhaltensweisen führt. > Um eine Liste abgeleiteter Klassen sicher an eine Funktion zu übergeben, die eine Liste von Basisklassen erwartet, können Entwickler
iEnumerable & lt; t & gt; verwenden, was kovariante
ist. Dies ermöglicht die Substitution abgeleiteter Typen durch Basistypen, die das Problem der Konvertierung ohne Kompromisse bei der Sicherheit auflöst.Das obige ist der detaillierte Inhalt vonWarum kann ich in C#keine 'Liste' in eine 'Liste' konvertieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!