Warum unterstützt der Mittelwerttyp C# nicht die Koordination oder Inverting?
Mit dem Konzept der Zusammenarbeit und des Wechselrichters kann eine kollaborative Änderung verwenden und einen Supertyp akzeptieren (z. B. Zuweisen
). Dieses Verhalten gilt jedoch nicht für den Werttyp, wie beispielsweise IEnumerable<T>
. IEnumerable<string>
IEnumerable<object>
Dokumente weisen darauf hin, dass diese Grenze darauf zurückzuführen ist, dass die Varianz nur für das Prinzip des Referenztyps anwendbar ist. Um den Grund zu verstehen, untersuchen wir das Konzept des Boxens und seine Auswirkungen auf die Koordination und den Wechselrichter. IEnumerable<int>
Werttyp wird direkt im Speicher gespeichert, und es gibt keine Logo -Trennung von seinem Wert. Wenn der Werttyp der Referenzvariablen zugeordnet ist, wird ein Prozess als Box bezeichnet. In diesem Prozess wird der Werttyp in einem Objektverpackungsgerät verpackt, das den Speicherort des Werttyps enthält. Mit diesem Verpackungsgerät kann der Werttyp als Objekt angesehen werden. Packung und Varianz
Um den Koordinierungseffekt zu erzielen, muss die CLR sicherstellen, dass sie dem Supertyp den Referenztyp zugewiesen wird. Dies liegt daran, dass der Verwendungscode nicht den genauen Typ des Objekts kennen muss, den es betrieben wird. Für den Typ gibt es jedoch keine Objektverpackung. Wenn der Werttyp der Referenzvariablen zugewiesen wird, ist daher der Packungsvorgang erforderlich. Dieser Verpackungsvorgang wird durch den Wert dargestellt und führt eine Indirekterschicht ein.
Die Identifizierung und die quadratische Differenz
Die Identifizierung ist die Fähigkeit, dasselbe Kennung beizubehalten, wenn das Objekt dem Basistyp oder abgeleiteten Typ zugewiesen wurde. In der koordinierten Änderung wird die Identifizierung des CLR -Anforderungsobjekts beibehalten. Für den Werttyp kann der Pack- und Box -Entfernungsvorgang jedoch die Identifizierung des Objekts unerwartet ändern. Dies verstößt gegen die Eigenschaften des Synergy Conversion -Logos.
Um die Wirksamkeit der Identifizierung und Referenz zu gewährleisten, begrenzt die CLR nur die Zusammenarbeit und den Wechselrichter auf den Referenztyp.
Das obige ist der detaillierte Inhalt vonWarum sind Werttypen in C#keine kovarianten oder kontravarianten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!