Rumah >pembangunan bahagian belakang >C++ >Kenapa tidak jenis nilai sokongan kovarians dalam 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 objekbaru, 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!