Heim > Backend-Entwicklung > C++ > Warum unterstützt Kovarianz Werttypen in C#nicht?

Warum unterstützt Kovarianz Werttypen in C#nicht?

Barbara Streisand
Freigeben: 2025-01-30 21:26:13
Original
709 Leute haben es durchsucht

Why Doesn't Covariance Support Value Types in C#?

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage