Rumah > pembangunan bahagian belakang > C++ > Mengapa Saya Tidak Boleh Menghantar `Senarai` ke `Senarai` secara Terus dalam C#?

Mengapa Saya Tidak Boleh Menghantar `Senarai` ke `Senarai` secara Terus dalam C#?

DDD
Lepaskan: 2025-01-17 01:01:12
asal
319 orang telah melayarinya

Why Can't I Directly Cast a `List` to a `List` in C#?

Senarai Casting ke Senarai

Pertimbangkan kod berikut:

public interface IDic
{
    int Id { get; set; }
    string Name { get; set; }
}
public class Client : IDic
{

}

List<Client> clients = new List<Client>();
Salin selepas log masuk

Ramai pengaturcara mungkin menganggap bahawa mereka boleh menghantar Senarai ke Senarai:

List<IDic> dics = (List<IDic>)clients;
Salin selepas log masuk

Walau bagaimanapun, ini bukan pelakon yang sah. Pelakon jenis ini tidak dibenarkan kerana ia akan melanggar keselamatan jenis. Jika anda mencuba pelakon ini, ralat berikut akan berlaku:

Cannot convert type 'System.Collections.Generic.List<Client>' to 'System.Collections.Generic.List<IDic>'
Salin selepas log masuk

Mengapa Pelakon ini Tidak Dibenarkan?

Sebab pelakon ini tidak dibenarkan adalah disebabkan oleh berpotensi untuk tingkah laku yang tidak selamat. Sebagai contoh, bayangkan senario ini:

public interface IFruit {}

public class Apple : IFruit {}
public class Banana : IFruit {}

...

List<Apple> apples = new List<Apple>();
List<IFruit> fruit = (List<IFruit>)apples; // Assumed cast
fruit.Add(new Banana());

// Eek - it's a banana!
Apple apple = apples[0];
Salin selepas log masuk

Dalam contoh ini, Senarai dihantar ke Senarai. Ini membolehkan objek Pisang ditambahkan pada senarai buah. Walau bagaimanapun, apabila elemen pertama senarai epal diakses, ia masih dianggap sebagai Apple. Ini boleh membawa kepada tingkah laku yang tidak dijangka dan potensi pepijat.

Pilihan Penukaran Selamat

Walaupun anda tidak boleh terus menghantar Senarai ke Senarai, terdapat cara selamat untuk menukar antara jenis ini.

  • ToList(): Dalam .NET 4.0 dan ke atas, anda boleh menggunakan Kaedah ToList() untuk menukar Senarai ke Senarai baharu. Kaedah ini mencipta senarai baharu dengan elemen yang sama tetapi menggunakan jenis antara muka yang ditentukan.
List<IFruit> fruit = apples.ToList<IFruit>();
Salin selepas log masuk
  • Cast().ToList(): In .NET 3.5, anda boleh menggunakan kaedah Cast() untuk mendapatkan IEnumerable daripada Senarai. Kemudian, anda boleh menggunakan ToList() untuk mencipta Senarai baharu daripada IEnumerable.
List<IFruit> fruit = apples.Cast<IFruit>().ToList();
Salin selepas log masuk

Adalah penting untuk ambil perhatian bahawa penukaran ini mencipta senarai baharu. Perubahan yang dibuat pada satu senarai tidak akan ditunjukkan dalam senarai yang lain. Walau bagaimanapun, perubahan yang dibuat pada objek dalam senarai akan kelihatan dalam kedua-dua senarai.

Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Menghantar `Senarai` ke `Senarai` secara Terus 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan