Rumah > pembangunan bahagian belakang > C++ > Bolehkah saya Hantar `Senarai` ke `Senarai` dalam C#?

Bolehkah saya Hantar `Senarai` ke `Senarai` dalam C#?

Patricia Arquette
Lepaskan: 2025-01-09 22:32:47
asal
294 orang telah melayarinya

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

Tukar senarai kelas terbitan kepada senarai kelas asas

Kovarian bermakna jenis terbitan boleh menggantikan jenis asasnya tanpa kehilangan sebarang fungsi. Dalam kes ini, kami mempunyai kelas asas (Haiwan) dan kelas terbitan (Cat), di mana kelas asas mengandungi kaedah maya Main yang menerima Senarai sebagai parameter input.

Kod berikut menunjukkan masalah penukaran:

<code class="language-csharp">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication9
{
    class Animal
    {
        public virtual void Play(List<Animal> animals) { }
    }
    class Cat : Animal
    {
        public override void Play(List<Animal> animals)
        {
        }
    }

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

Menyusun kod akan mengakibatkan ralat: Argumen 1: tidak boleh menukar daripada 'System.Collections.Generic.List' kepada 'System.Collections.Generic.List >

Ralat ini berlaku kerana Senarai ialah struktur data boleh tulis. Jika kami membenarkan penukaran daripada Senarai

kepada Senarai, anjing boleh ditambahkan pada senarai kucing, yang mungkin membawa kepada tingkah laku yang tidak dijangka.

Untuk menyelesaikan masalah ini, C# 4 memperkenalkan konsep yang dipanggil "kovarians generik" untuk antara muka yang diketahui selamat. IEnumerable

ialah antara muka sedemikian. Memandangkan IEnumerable tidak membenarkan mutasi, ia dianggap selamat secara kovarian.

Kami boleh menyelesaikan masalah penukaran dengan mengubah suai kaedah Play untuk menerima IEnumerable

dan bukannya Senarai:

<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
Dengan menggunakan antara muka

dan bukannya IEnumerable<T>, kami memanfaatkan ciri kovarians C#, mengelakkan ralat penukaran jenis dan memastikan keselamatan kod. List<T> hanya membenarkan data dibaca, tidak diubah suai, jadi selamat untuk menukar IEnumerable<T> kepada List<Cat>. IEnumerable<Animal>

Atas ialah kandungan terperinci Bolehkah saya Hantar `Senarai` 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