Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Membuat Senarai Jenis Generik Terbuka dalam C#?

Bagaimanakah Saya Boleh Membuat Senarai Jenis Generik Terbuka dalam C#?

DDD
DDDasal
2025-01-11 08:42:40699semak imbas

How Can I Create a List of Open Generic Types in C#?

Mengendalikan Senarai Jenis Generik Terbuka dalam C#

Bekerja dengan jenis generik terbuka (generik dengan parameter jenis yang tidak ditentukan) dalam C# memberikan cabaran kerana pengehadan dalam polimorfisme generik.

Cabaran:

Pertimbangkan kelas ini:

<code class="language-csharp">public abstract class Data<T> { }

public class StringData : Data<string> { }

public class DecimalData : Data<decimal> { }</code>

Percubaan untuk membuat senarai yang mengandungi contoh jenis Data berbeza ini secara langsung gagal:

<code class="language-csharp">List<Data> dataCollection = new List<Data>(); // Compiler error!
dataCollection.Add(new DecimalData());
dataCollection.Add(new StringData());</code>

Ralat pengkompil timbul kerana Data ialah jenis generik terbuka, memerlukan hujah jenis.

Penyelesaian:

Ketiadaan pengendali berlian C# menghalang instantiasi langsung senarai generik terbuka. Polimorfisme tidak digunakan secara langsung untuk jenis generik terbuka. Penyelesaiannya ialah menggunakan jenis asas atau antara muka biasa:

<code class="language-csharp">public interface IData { void SomeMethod(); }

public abstract class DataBase { public abstract void SomeMethod(); }</code>

Kini, anda boleh membuat senarai menggunakan antara muka atau kelas asas:

<code class="language-csharp">List<IData> dataList = new List<IData>();
dataList.Add(new StringData()); // StringData must implement IData
dataList.Add(new DecimalData()); // DecimalData must implement IData

foreach (var item in dataList)
    item.SomeMethod();


List<DataBase> dataBaseList = new List<DataBase>();
dataBaseList.Add(new StringData()); // StringData must inherit from DataBase
dataBaseList.Add(new DecimalData()); // DecimalData must inherit from DataBase

foreach (var item in dataBaseList)
    item.SomeMethod();</code>

Pendekatan ini membolehkan koleksi pelbagai Data jenis, tetapi ia mengorbankan penaipan yang kuat berbanding dengan penyelesaian yang benar-benar generik. Contoh SomeMethod() menyerlahkan keperluan untuk antara muka biasa atau kaedah abstrak untuk mengekalkan fungsi merentas jenis yang berbeza.

Bacaan Lanjut:

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membuat Senarai Jenis Generik Terbuka 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