Rumah >pembangunan bahagian belakang >C++ >Kenapa tidak jenis nilai kovarian atau kontravariant dalam C#?

Kenapa tidak jenis nilai kovarian atau kontravariant dalam C#?

Barbara Streisand
Barbara Streisandasal
2025-01-30 21:21:08595semak imbas

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

Kenapa tidak jenis nilai sederhana C# tidak menyokong koordinasi atau terbalik?

Konsep kerjasama dan penyongsang membolehkan menggunakan perubahan kolaboratif dan menerima jenis super (contohnya, menyerahkan

ke

). Walau bagaimanapun, tingkah laku ini tidak terpakai kepada jenis nilai, seperti IEnumerable<T>. IEnumerable<string> IEnumerable<object> Dokumen menunjukkan bahawa had ini adalah kerana varians hanya terpakai kepada prinsip jenis rujukan. Untuk memahami sebabnya, mari kita meneroka konsep tinju dan kesannya terhadap koordinasi dan penyongsang. IEnumerable<int>

peranan jenis nilai dan tinju

Jenis nilai disimpan secara langsung dalam ingatan, dan tidak ada pemisahan logo dari nilainya. Apabila jenis nilai diberikan kepada pemboleh ubah rujukan, proses dipanggil kotak. Dalam proses ini, jenis nilai dibungkus dalam peranti pembungkusan objek, yang mengandungi lokasi memori jenis nilai. Peranti pembungkusan ini membolehkan jenis nilai dianggap sebagai objek. pembungkusan dan varians

Untuk membuat kesan penyelarasan, CLR mesti memastikan bahawa ia tidak akan diwakili apabila diberikan jenis rujukan kepada jenis super. Ini kerana kod penggunaan tidak perlu mengetahui jenis objek yang tepat yang beroperasi. Walau bagaimanapun, untuk jenis ini, tiada pembungkusan objek; Oleh itu, apabila jenis nilai diberikan kepada pemboleh ubah rujukan, operasi pembungkusan diperlukan. Operasi pembungkusan ini akan diwakili oleh nilai, memperkenalkan lapisan ketidakpatuhan.

Pengenalpastian dan perbezaan persegi

Pengenalpastian adalah keupayaan untuk mengekalkan pengenal yang sama apabila diberikan objek ke jenis asas atau jenis yang diperoleh. Dalam perubahan yang diselaraskan, pengenalpastian objek yang meminta CLR dikekalkan. Walau bagaimanapun, untuk jenis nilai, operasi pembungkusan dan kotak penyingkiran mungkin secara tidak disangka -sangka mengubah pengenalan objek. Ini melanggar ciri -ciri logo penukaran sinergi.

Oleh itu, untuk memastikan keberkesanan pengenalan dan rujukan, CLR hanya menghadkan kerjasama dan penyongsang kepada jenis rujukan.

Atas ialah kandungan terperinci Kenapa tidak jenis nilai kovarian atau kontravariant dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn