在处理泛型代码时,通常会遇到需要操作各种类型数据的场景。但是,在处理开放泛型类型时,C#的泛型多态性存在局限性。
考虑以下代码:
<code class="language-csharp">public abstract class Data<T> { } public class StringData : Data<string> { } public class DecimalData : Data<decimal> { } List<Data<T>> dataCollection = new List<Data<T>>(); // 错误:缺少类型参数 dataCollection.Add(new DecimalData()); dataCollection.Add(new StringData());</code>
在此示例中,您希望创建一个列表,该列表可以保存不同Data子类型的实例。但是,最后一行会因编译器错误而失败,因为开放泛型类型(例如Data)需要指定类型参数。
C#不支持对开放泛型类型的真正多态性。为了克服这个问题,您可以选择以下几种方法:
创建对象列表:
<code class="language-csharp"> List<object> dataCollection = new List<object>(); dataCollection.Add(new DecimalData()); dataCollection.Add(new StringData());</code>
但是,这种方法会丢失类型安全性,并且在访问数据时需要显式转换。
使用非泛型接口或抽象类:
<code class="language-csharp"> public interface IData { void SomeMethod(); } public abstract class Data<T> : IData { public void SomeMethod() { } } List<IData> dataCollection = new List<IData>(); dataCollection.Add(new DecimalData()); dataCollection.Add(new StringData());</code>
这允许对列表元素进行非泛型操作,但会牺牲一些泛型性和类型安全性。
理解在C#中使用开放泛型类型的局限性和权衡非常重要,并选择最适合您特定需求的解决方案。
以上是如何在 C# 中通过开放泛型类型实现多态性?的详细内容。更多信息请关注PHP中文网其他相关文章!