Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Menghantar `Senarai` dengan Selamat ke `Senarai` dalam C#?

Bagaimanakah Saya Boleh Menghantar `Senarai` dengan Selamat ke `Senarai` dalam C#?

Mary-Kate Olsen
Lepaskan: 2025-01-09 22:51:46
asal
682 orang telah melayarinya

How Can I Safely Cast a `List` to a `List` in C#?

Tukar dengan selamat kepada Senarai dalam C#

Dalam C#, apabila berurusan dengan jenis warisan dan generik, anda mungkin menghadapi situasi di mana anda perlu menukar senarai objek kelas terbitan kepada senarai objek kelas asas. Ini boleh menyebabkan masalah jika kelas asas mengandungi kaedah maya yang ditindih dalam kelas terbitan.

Pertimbangkan contoh berikut:

<code class="language-csharp">class Animal
{
    public virtual void Play(List<Animal> animals) { }
}

class Cat : Animal
{
    public override void Play(List<Animal> animals)
    {
        // Cat 特定的实现
    }
}

class Program
{
    static void Main(string[] args)
    {
        Cat cat = new Cat();
        cat.Play(new List<Cat>()); // 错误:参数 1 无法从“System.Collections.Generic.List<Cat>”转换为“System.Collections.Generic.List<Animal>”
    }
}</code>
Salin selepas log masuk

Apabila menyusun kod ini, anda akan menemui mesej ralat "Parameter 1: Tidak boleh menukar daripada 'System.Collections.Generic.List' kepada 'System.Collections.Generic.List'". Ini kerana, walaupun kelas Cat mengatasi kaedah Main, jenis parameter kaedah (Senarai) tetap sama.

Untuk menyelesaikan masalah ini, anda perlu memahami konsep kovarians generik. Kovarians generik membolehkan anda melanjutkan dengan selamat jenis parameter dalam penggantian kelas terbitan. Dalam kes ini, anda ingin melanjutkan jenis parameter daripada Senarai kepada Senarai.

C# 4 memperkenalkan sokongan untuk kovarians generik, dengan bantuan IEnumerable dan antara muka selamat kovariansnya. Dengan mengisytiharkan kaedah Main dalam kelas Haiwan sebagai:

<code class="language-csharp">public virtual void Play(IEnumerable<Animal> animals) { }</code>
Salin selepas log masuk

Kemudian ganti dalam kelas Cat:

<code class="language-csharp">public override void Play(IEnumerable<Animal> animals) { }</code>
Salin selepas log masuk

Anda boleh menjadikan kaedah Main secara kovarian selamat. Ini membolehkan anda menghantar Senarai kepada kaedah dan kemudian menggunakan kovarians untuk menukarnya dengan selamat kepada IEnumerable. Kod yang diubah suai kelihatan seperti ini:

<code class="language-csharp">class Animal
{
    public virtual void Play(IEnumerable<Animal> animals) { }
}

class Cat : Animal
{
    public override void Play(IEnumerable<Animal> animals) { }
}

class Program
{
    static void Main()
    {
        Cat cat = new Cat();
        cat.Play(new List<Cat>()); 
    }
}</code>
Salin selepas log masuk

Kod ini akan menyusun dan melaksanakan dengan jayanya tanpa ralat, membolehkan anda menukar Senarai dengan selamat apabila kaedah kelas asas ditakrifkan menggunakan IEnumerable ke Senarai.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghantar `Senarai` dengan Selamat ke `Senarai` dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan