Tukar dengan selamat
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
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
C# 4 memperkenalkan sokongan untuk kovarians generik, dengan bantuan IEnumerable
<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
<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
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!