Rumah >pembangunan bahagian belakang >C++ >Mengapa saya tidak boleh menukar `senarai` ke` senarai` dalam C#?
Apabila lulus senarai kelas yang diperolehi kepada fungsi yang mengharapkan senarai kelas asas, pemaju mungkin menghadapi ralat:
cannot convert from 'System.Collections.Generic.List<ConsoleApplication1.DerivedClass>' to 'System.Collections.Generic.List<ConsoleApplication1.BaseClass>'
Kesalahan ini tidak segera intuitif, kerana seseorang mungkin mengandaikan bahawa senarai kelas yang diperoleh harus bersesuaian dengan senarai kelas asas. Untuk memahami sebab di sebalik sekatan ini, penting untuk memahami konsep kovarians dalam koleksi generik. Dalam C# boleh sama ada kovarian atau invarian. Koleksi kovarian membolehkan penggantian jenis yang diperoleh untuk jenis asas mereka, sementara koleksi invarian tidak. adalah contoh koleksi
invarian. Ini bermakna senarai & lt; derivedclass & gt; tidak boleh diberikan kepada senarai & lt; baseclass & gt; Kerana pengkompil menjamin bahawa semua elemen dalam senarai akan selalu menjadi jenis yang diisytiharkan T.
Implikasi invarians untuk senarai & lt; t & gt; T & gt; Melindungi daripada operasi tidak sah yang boleh melanggar keselamatan jenis. Sebagai contoh, jika senarai & lt; baseclass & gt; ditugaskan ke senarai & lt; derivedclass & gt;, contoh kelas yang diperolehi berpotensi digantikan dengan contoh kelas asas, yang membawa kepada tingkah laku yang tidak dijangka. > Untuk selamat lulus senarai kelas yang diperolehi kepada fungsi yang menjangkakan senarai kelas asas, pemaju boleh menggunakanienumerable & lt; t & gt;
, iaitucovariant . Ini membolehkan penggantian jenis yang diperolehi untuk jenis asas, menyelesaikan masalah penukaran tanpa menjejaskan keselamatan jenis.
Atas ialah kandungan terperinci Mengapa saya tidak boleh menukar `senarai` ke` senarai` dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!