Das Weglassen kovarianter Klassen in C# 4.0: Ein tieferer Blick
C# 4.0 führte generische Varianz für Schnittstellen ein und ermöglichte eine flexible Verwendung von Typparametern. Diese Funktionalität wurde jedoch nicht auf Klassen ausgeweitet. In diesem Artikel geht es um die Gründe für diese Designentscheidung.
Die Hürden der Umsetzung
Die Einführung kovarianter Varianz in Klassen (z. B. eine hypothetische C<T>
Klasse) stellt erhebliche Herausforderungen bei der Implementierung dar. Die Hauptbeschränkung ergibt sich aus der Tatsache, dass T
nur als Ausgabeparameter, in Settern oder als Feld verwendet werden kann.
Diese Einschränkung ist eine direkte Folge von Feldern, denen Getter fehlen. Im Gegensatz zu Eigenschaften bieten Felder keinen schreibgeschützten Zugriff. Daher könnte eine kovariante Klasse keinen veränderlichen Zustand besitzen, was ihre praktischen Anwendungen stark einschränkt.
Kosten und Nutzen abwägen
Obwohl kovariante unveränderliche Klassen (wie Listen und Stapel) zweifellos von Vorteil wären, wurden die umfangreichen Änderungen am C#-Typsystem, die zu ihrer Unterstützung erforderlich waren, zum Zeitpunkt der Veröffentlichung von C# 4.0 nicht als gerechtfertigt angesehen.
Veranschaulichung der Kovarianz in unveränderlichen Strukturen
Das folgende Beispiel zeigt die Kovarianz in einem unveränderlichen Stapel:
<code class="language-csharp">sealed class Stack<out T> { private readonly T head; private readonly Stack<T> tail; }</code>
Dies ermöglicht kovariante Zuweisungen:
<code class="language-csharp">Stack<string> strings = null; strings = strings.Push("hello"); strings = strings.Push("goodbye"); Stack<object> objects = strings; // Covariant assignment objects = objects.Push(123); //This would be an error if Stack<T> was mutable</code>
Das Hinzufügen einer Ganzzahl zum Stapel bleibt aufgrund der Unveränderlichkeit des Stapels typsicher. Der Vorgang verstößt nicht gegen die Typensicherheit.
Das obige ist der detaillierte Inhalt vonWarum werden kovariante Klassen in C# 4.0 nicht unterstützt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!