gpt4 book ai didi

c#-4.0 - 为什么泛型类型参数的 .NET 4 差异不适用于类?

转载 作者:行者123 更新时间:2023-12-03 22:28:43 24 4
gpt4 key购买 nike

Possible Duplicates:
Why isn't there generic variance for classes in C# 4.0?
Why does C# (4.0) not allow co- and contravariance in generic class types?

.NET 4.0 新的泛型类型参数的协变和逆变只适用于接口(interface)和委托(delegate)。类也不支持它的原因是什么?

最佳答案

为了类型安全,C# 4.0 仅对标有 inout 的类型参数支持协变/逆变。

如果这扩展到类,您还必须用 in 我们的 out 标记类型参数,这最终会受到非常严格的限制。这很可能是 CLR 的设计者选择不允许它的原因。例如,考虑以下类:

public class Stack<T>
{
int position;
T[] data = new T[100];
public void Push (T obj) { data[position++] = obj; }
public T Pop() { return data[--position]; }
}

在我们的输出中将 T 注释为 any 是不可能的,因为 T 用于输入和输出位置。因此,此类永远不会协变或逆变 - 即使在 C# 中支持类的协变/逆变类型参数。

接口(interface)很好地解决了这个问题。我们可以如下定义两个接口(interface),并让 Stack 实现两者:

public interface IPoppable<out T> { T Pop(); }
public interface IPushable<in T> { void Push (T obj); }

注意 T 对于 IPoppable 是协变的,对于 IPushable 是逆变的。这意味着 T 可以是协变的或逆变的 - 取决于您是转换为 IPoppable 还是 IPushable。

协变/逆变对类的使用有限的另一个原因是它会排除使用类型参数作为字段 - 因为字段有效地允许输入和输出操作。事实上,如果类型参数标记为 in 或 out,很难编写一个完全有用的类。即使是编写协变 Enumerable 实现的最简单的情况也会带来挑战 - 首先如何将源数据放入实例中?

关于c#-4.0 - 为什么泛型类型参数的 .NET 4 差异不适用于类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3820171/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com