c# Dalam pengaturcaraan yang berorientasikan objek, warisan kelas yang diperolehi sangat biasa. Walau bagaimanapun, apabila memproses set (seperti senarai), mengapa tidak mungkin menggunakan kelas asas yang sama untuk mengisytiharkannya, yang mungkin mengelirukan.
Pertimbangkan kod berikut:
Kod ini akan menyebabkan kesilapan kompilasi apabila cuba menggunakan
<code class="language-csharp">interface A { } class B : A { } class C : B { } class Test { static void Main(string[] args) { A a = new C(); // 正确 List<A> listOfA = new List<C>(); // 编译错误 } }</code>
. Walaupun contoh Kelas C yang diperolehi boleh diberikan kepada pembolehubah kelas asas A, koleksi itu tidak baik. List<C>
List<A>
Alasan untuk had ini terletak pada kaedah senarai permulaan C#. Apabila membuat , C# akan menjana struktur data dalaman senarai semasa berjalan, dan diharapkan jenis penyimpanan adalah objek A. Walau bagaimanapun, kerana C adalah kelas derivatif A, objeknya mempunyai ahli tambahan dan menduduki lebih banyak ingatan daripada objek. Oleh itu, penugasan ke
List<A>
Untuk menyelesaikan masalah ini dan ubah List<C>
sebagai List<A>
, anda boleh menggunakan kaedah berikut:
<.> 1. Mengekspresikan penukaran: List<派生类>
List<基类>
<.> 2. LINQ:
Gunakan LINQ untuk menukar elemen seperti berikut:
<code class="language-csharp">List<A> listOfA = new List<C>().ConvertAll(x => (A)x);</code>
Kaedah ini membolehkan penukaran dan penjajaran alamat memori yang selamat untuk memastikan operasi normal senarai.
Atas ialah kandungan terperinci Mengapa saya tidak dapat memberikan senarai ke senarai di C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!