Rumah >pembangunan bahagian belakang >C++ >Kenapa tidak jenis nilai sokongan kovarians dalam C#?

Kenapa tidak jenis nilai sokongan kovarians dalam C#?

Barbara Streisand
Barbara Streisandasal
2025-01-30 21:26:13759semak imbas

Why Doesn't Covariance Support Value Types in C#?

c# kovarians dan sekatan jenis nilai

kovarians dalam C# membolehkan menetapkan jenis antara muka yang diperoleh kepada jenis antara muka asasnya. Ini membolehkan merawat objek jenis yang diperolehi sebagai objek jenis asas. Walau bagaimanapun, ciri ini sengaja dihadkan untuk jenis nilai.

Peranan tinju dan identiti

Alasan teras untuk batasan ini adalah proses tinju. Apabila jenis nilai diberikan kepada pemboleh ubah antara muka, ia dibuang ke dalam jenis rujukan pada timbunan. Ini mewujudkan objek

baru, mengubah identiti nilai asal. Jenis rujukan, sudah tinggal di timbunan, jangan menjalani tinju yang berubah-ubah identiti ini.

Mengekalkan identiti adalah penting untuk kovarians. Sekiranya kovarians dibenarkan untuk jenis nilai, mengubahsuai objek jenis yang diperolehi dalam koleksi jenis asas boleh membawa kepada tingkah laku yang tidak dijangka dan ketidakkonsistenan identiti.

Contoh ilustrasi

coretan kod berikut menunjukkan masalah:

<code class="language-csharp">IEnumerable<int> intList = new List<int>();
IEnumerable<object> objList = intList; // Covariance (if allowed for value types)

intList.Add(10);
Console.WriteLine(((List<int>)objList)[0]); // Output: 10
intList[0] = 20;
Console.WriteLine(((List<int>)objList)[0]); // Output: 0  (Unexpected!)</code>
manakala tugasan awal berfungsi kerana kovarians (hipotesis), mengubahsuai

tanpa diduga mengubah nilai berkotak dalam intList, menonjolkan isu identiti yang menghalang sokongan kovarians untuk jenis nilai dalam C#. Kedua objList menunjukkan output yang tidak dijangka 0 kerana kotak Console.WriteLine dalam int tidak dikaitkan secara langsung dengan objList dalam int selepas pengubahsuaian. The intList memegang rujukan kepada objList asal berkotak yang kekal tidak berubah. int

Atas ialah kandungan terperinci Kenapa tidak jenis nilai sokongan kovarians 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