c# Kovarianz und die Wertstypsbeschränkung
Kovarianz in C# ermöglicht das Zuweisen eines abgeleiteten Schnittstellentyps seinem Basis -Schnittstellen -Typ. Dadurch werden Objekte des abgeleiteten Typs als Objekte des Basistyps behandelt. Diese Funktion ist jedoch absichtlich für Werttypen eingeschränkt.
Die Rolle von Boxen und Identität
Der Kerngrund für diese Einschränkung ist der Boxprozess. Wenn einer Schnittstellenvariablen ein Werttyp zugewiesen wird, wird er in einen Referenztyp auf dem Haufen eingebaut. Dies erstellt ein neues Objekt, das die Identität des ursprünglichen Werts verändert. Referenztypen, die sich bereits auf dem Haufen befinden, unterziehen Sie sich nicht mit diesem Identitäts-Veränderungsdach.
Die Aufrechterhaltung der Identität ist für die Kovarianz von entscheidender Bedeutung. Wenn die Kovarianz für Werttypen zulässig wäre, kann das Ändern eines abgeleiteten Typ -Objekts innerhalb einer Basistypsammlung zu unerwarteten Verhaltens- und Identitätskonsistenzen führen.
Illustratives Beispiel
Der folgende Code -Snippet zeigt das Problem:
<code class="language-csharp">IEnumerable<int> intList = new List<int>(); IEnumerable<object> objList = intList; // Covariance (if allowed for value types) intList.Add(10); Console.WriteLine(((List<int>)objList)[0]); // Output: 10 intList[0] = 20; Console.WriteLine(((List<int>)objList)[0]); // Output: 0 (Unexpected!)</code>
Während die anfängliche Zuordnung aufgrund einer (hypothetischen) Kovarianz funktioniert, verändert die Änderung von intList
unerwartet den Box -Wert in objList
und zeigt das Identitätsproblem hervor, das die Kovarianzunterstützung für Werttypen in C#verhindert. Das zweite Console.WriteLine
zeigt die unerwartete Ausgabe von 0, da die Boxed int
in objList
nach der Änderung nicht direkt mit dem int
in intList
verknüpft ist. Der objList
enthält einen Verweis auf das Original Boxed int
, das unverändert bleibt.
Das obige ist der detaillierte Inhalt vonWarum unterstützt Kovarianz Werttypen in C#nicht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!