Die Varianz in den Generika ermöglicht es dem Typ, die Zusammenarbeit oder die Umkehrung seiner Parameter zu erben. Diese Mechanismen gelten jedoch nicht für Werttypen. Um diese Grenze zu verstehen, müssen wir das Konzept der Verpackung und deren Auswirkungen auf die Type Sicherheit untersuchen.
Deklaration ist eine Änderung. Durch die Koordination können abgeleitete Typen den Basistyp ersetzen, z. B.
und. Der Werttyp ist jedoch nicht der Fall. Betrachten Sie den folgenden Code:
IEnumerable<T>
IEnumerable<string>
Dieser Code kann Kompilierungsfehler verursachen, da der Werttyp als unveränderlich angesehen wird. Die Varianz ist nur zum Referenztyp geeignet. Der Grund ist die Komplexität der Box. IEnumerable<object>
1 2 |
|
-Packagesgerät wird um
erstellt. Auf diese Weise können Werttypen in einigen Fällen als Referenztyp betrachtet werden.
int
In Bezug auf kollaborative und umgekehrte Boxen bringt Boxen jedoch ernsthafte Arten von Sicherheitsproblemen. Wenn der Werttyp zulässig ist, kann der abgeleitete Typ unterschiedliche Daten aus seinem Basistyp enthalten. Dies kann zu einem zufälligen Verhalten und potenziellen Datenschäden führen. object
int
kann beispielsweise Objekte mit unterschiedlichen object
-Anzeigungsformen enthalten. Wenn diese Objekte besucht werden, müssen sie zur Laufzeit in den ursprünglichen
Um die Sicherheit der Typ zu erhalten, begrenzt die CLR die Varianz zum Referenztyp. Dies kann sicherstellen, dass das Formular konsistent ist und die Konvertierung zwischen verschiedenen Typen keine Datenintegrität verursacht.
Das obige ist der detaillierte Inhalt vonWarum sind Werttypen in C# Generika invariant?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!