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

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

Susan Sarandon
Susan Sarandonasal
2025-01-28 13:51:09795semak imbas

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

C# Jenis Masalah Penukaran: Mengapa

tidak boleh ditukar kepada List<string>? List<object>

Dalam C#, cuba berikan objek

ke List<string> pembolehubah untuk menyebabkan kelainan yang menarik. Kenapa penukaran ini tidak dibenarkan dan selalu mengganggu banyak pemaju. List<object>

analisis masalah

Pertimbangkan serpihan kod berikut:

Percubaan penukaran minat dan eksplisit gagal, yang membuat kita tertanya -tanya sebabnya.
<code class="language-csharp">List<string> sl = new List<string>();
List<object> ol;
ol = sl; // 隐式转换不被允许
ol = (List<object>)sl; // 显式转换也失败</code>

punca akar

Sebab utama had ini ialah ketidakkonsistenan mungkin berlaku dalam senarai. Jika kita membenarkan penukaran ini dan kemudian tambahkan jenis ke senarai ke senarai, senarai rentetan akan menjadi tidak konsisten.

Apabila senarai pertama lelaran dirujuk, kita akan menemui penukaran kelas yang tidak normal, kerana contoh Foo tidak dapat ditukar kepada rentetan. Konsistensi jenis penyelenggaraan adalah penting untuk memastikan integriti data dalam senarai.

penukaran terbalik: lebih banyak dalam perbincangan yang lebih baik Foo

Walau bagaimanapun, mengenai penukaran terbalik, masalah yang menarik muncul:

Adakah penukaran ini dibenarkan? Walaupun ia kelihatan berguna, membolehkan penukaran ini mungkin ralat atau tidak konsisten semasa runtime. Dari kelas yang lebih umum () kepada penukaran kelas yang lebih spesifik (), apa -apa objek yang ditambahkan ke senarai rentetan mungkin tidak serasi dengan senarai objek.

Bolehkah penukaran terbalik berjaya dalam C#?

<code class="language-csharp">List<object> ol = new List<object>();
List<string> sl;
sl = (List<string>)ol;</code>
Tidak jelas sama ada penukaran terbalik ini sah di C#. Sekiranya ia sah, ia akan menyerlahkan perbezaan antara penukaran tersembunyi paparan dan penukaran eksplisit, dan yang terakhir nampaknya melanggar peraturan konsistensi jenis. Ujian dan penjelasan lanjut mengenai aspek ini akan sangat berharga.

Atas ialah kandungan terperinci Mengapa saya tidak boleh membuang `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