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
Mary-Kate Olsenasal
2025-01-09 22:51:46688semak imbas

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>

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>

Kemudian ganti dalam kelas Cat:

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

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>

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!

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