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>
Menyusun kod akan mengakibatkan ralat: Argumen 1: tidak boleh menukar daripada 'System.Collections.Generic.List
kepada Senarai
ialah antara muka sedemikian. Memandangkan 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>
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!