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
DDDasal
2025-01-17 01:01:12324semak imbas

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>();

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

List<IDic> dics = (List<IDic>)clients;

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>'

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];

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>();
  • 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();

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!

Kenyataan:
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