Rumah >pembangunan bahagian belakang >C++ >Mengapa saya tidak boleh menukar `senarai` ke` senarai` dalam C#?

Mengapa saya tidak boleh menukar `senarai` ke` senarai` dalam C#?

Susan Sarandon
Susan Sarandonasal
2025-01-30 13:06:11749semak imbas

Why Can't I Convert a `List` to a `List` in C#?

Senarai Invariant: Memahami sekatan penukaran

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 menggunakan

ienumerable & lt; t & gt;

, iaitu

covariant . 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!

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