polimorfisme tipe generik

public class A {}

public class B : A {}

sekarang apa cara terbaik untuk membuat ini berfungsi

List<A> a;
List<B> b = new List<B>();
a = b; // throw Cannot convert List<B> to List<A>

Terima kasih


person Proviste    schedule 06.03.2011    source sumber
comment
Lihat: stackoverflow.com/questions/2184551/   -  person Daniel A. White    schedule 07.03.2011


Jawaban (1)


Tipe List<T> tidak mendukung kovarians, jadi Anda tidak dapat menetapkan List<B> langsung ke List<A> meskipun B sendiri dapat ditetapkan langsung ke A. Anda harus melewati daftar b, mengonversi dan menambahkan item ke dalam daftar a seiring berjalannya waktu. Metode ConvertAll adalah cara mudah untuk melakukan hal ini:

List<B> b = new List<B>();
// ...
List<A> a = b.ConvertAll(x => (A)x);
person LukeH    schedule 06.03.2011
comment
Apa perbedaan perilaku antara ConvertAll(x =› (A)x) dan Select(x =› (A)x) ? - person Proviste; 07.03.2011
comment
ConvertAll adalah metode instan pada kelas List<T> dan membuat List<T> baru dari daftar yang ada. Select adalah metode ekstensi yang bekerja pada IEnumerable<T> mana pun dan membuat urutan IEnumerable<T> baru. Penggunaan ConvertAll harus sedikit lebih cepat daripada Select karena dapat melakukan beberapa optimasi (misalnya, dapat mengalokasikan array target ke panjang yang benar di awal daripada perlu mengubah ukurannya saat itu juga, dan ia dapat mengakses array yang mendasari daftar sumber secara langsung daripada perlu membuat instance dan menggunakan objek enumerator terpisah). - person LukeH; 07.03.2011