在 C# 中处理开放泛型类型的列表
由于泛型多态性的限制,在 C# 中使用开放泛型类型(具有未指定类型参数的泛型)会带来挑战。
挑战:
考虑这些课程:
<code class="language-csharp">public abstract class Data<T> { } public class StringData : Data<string> { } public class DecimalData : Data<decimal> { }</code>
尝试创建包含这些不同 Data
类型实例的列表直接失败:
<code class="language-csharp">List<Data> dataCollection = new List<Data>(); // Compiler error! dataCollection.Add(new DecimalData()); dataCollection.Add(new StringData());</code>
出现编译器错误是因为 Data
是开放泛型类型,需要类型参数。
解决方案:
C# 缺少菱形运算符,导致无法直接实例化开放泛型列表。 多态性并不直接应用于开放泛型类型。 解决方法是使用通用的基本类型或接口:
<code class="language-csharp">public interface IData { void SomeMethod(); } public abstract class DataBase { public abstract void SomeMethod(); }</code>
现在,您可以使用接口或基类创建列表:
<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>
这种方法允许收集不同的 Data
类型,但与真正的通用解决方案相比,它牺牲了强类型。 SomeMethod()
示例强调了需要通用接口或抽象方法来维护不同类型的功能。
进一步阅读:
以上是如何在 C# 中创建开放泛型类型列表?的详细内容。更多信息请关注PHP中文网其他相关文章!