Rumah >pembangunan bahagian belakang >C++ >Bolehkah saya memberikan senarai objek kelas yang diperolehi ke senarai kelas asas di C#?

Bolehkah saya memberikan senarai objek kelas yang diperolehi ke senarai kelas asas di C#?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-02-02 05:31:08675semak imbas

Can I Assign a List of Derived Class Objects to a Base Class List in C#?

c# Dalam bahasa pengaturcaraan C#, senarai objek kelas yang diperolehi ke senarai rujukan kelas asas akan mencetuskan masalah kerjasama. Masalah ini berlaku apabila kategori yang diperoleh tidak wujud di kelas asas.

Sebagai contoh, pertimbangkan kod berikut:

Dalam kod ini, senarai objek zirafah diberikan kepada senarai yang dirujuk oleh haiwan. Walau bagaimanapun, tugasan ini gagal semasa penyusunan disebabkan oleh masalah koordinasi.
<code class="language-csharp">class Animal { }
class Giraffe : Animal { }

static void Main(string[] args)
{
    List<Giraffe> giraffes = new List<Giraffe>();
    List<Animal> animals = giraffes; // 编译时错误
}</code>

kerjasama dan bukan kebolehpasaran

jenis generik C #boleh diselaraskan atau tidak berubah. Penyelarasan membolehkan rujukan kelas asas merujuk objek kelas yang diperolehi, sementara tidak -Degeneration menghalang tugasan tersebut. Untuk senarai, tingkah laku lalai adalah bukan kebolehpasaran, yang bermaksud bahawa senarai tidak boleh diberikan untuk disenaraikan

.

penyelesaian

Untuk menyelesaikan masalah ini, terdapat beberapa penyelesaian:

Penukaran Eksplisit:

Kod berikut boleh digunakan untuk memaparkan senarai

untuk menyenaraikan
    :
  • Walau bagaimanapun, tidak disyorkan untuk menggunakan penukaran eksplisit ini, kerana jika penukaran tidak sah, ia boleh menyebabkan kesilapan runtime.
  • kaedah convertall:
anda boleh menggunakan senarai
<code class="language-csharp">List<Animal> animals = (List<Animal>)giraffes; // 不推荐,可能导致运行时错误</code>
. Contohnya:

  • Melaksanakan antara muka ICovariant Ia boleh ditentukan secara eksplisit untuk menentukan perubahan kolaboratif jenis generik melalui antara muka tersuai. Dengan melaksanakan antara muka ICOVARIANT , kelas boleh membenarkan objek menggunakan jenis generik kelas genetik untuk merujuk tugasan. .
<code class="language-csharp">List<Animal> animals = giraffes.ConvertAll(g => (Animal)g);</code>
Kaedah yang harus dipilih bergantung kepada situasi tertentu dan keperluan untuk keteguhan kod. Kaedah
    biasanya pilihan pertama, kerana ia lebih selamat dan menyatakan niat penukaran. Penggunaan lebih sesuai dengan prinsip pengaturcaraan generik, mengelakkan risiko penukaran eksplisit.

Atas ialah kandungan terperinci Bolehkah saya memberikan senarai objek kelas yang diperolehi ke senarai kelas asas di 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