Heim > Backend-Entwicklung > C++ > Warum sind Werttypen in C#keine kovarianten oder kontravarianten?

Warum sind Werttypen in C#keine kovarianten oder kontravarianten?

Barbara Streisand
Freigeben: 2025-01-30 21:21:08
Original
544 Leute haben es durchsucht

Why Aren't Value Types Covariant or Contravariant in C#?

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>

Die Rolle des Werttyps und des Boxens

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!

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