为什么 C# 4.0 的协变/逆变仅限于参数化接口和委托类型?

问题描述 投票:0回答:3

这是 CLR 的限制还是与现有代码存在兼容性问题?

这与 C# 4.0 中委托组合的混乱方差有关吗?

编辑: 是否有可能有一种使用协变/逆变的语言在 CLR 上运行而没有这种限制?

c# clr c#-4.0 covariance contravariance
3个回答
8
投票

您将需要阅读 Eric Lippert 的文章,了解它为何如此工作。缺点是他们允许尽可能多的差异,而不允许开发人员在编程中犯下可能导致难以追踪错误的严重错误。 4.0 中的差异量比 3.0 规则大大扩展,据我了解,这是对开发人员有利的内容和安全允许的内容之间的平衡,不会因无意的错误而造成太多麻烦。

链接


5
投票

简单答案:这是 CLR 限制。

(我还没有在任何地方看到对此有一个好的、具体的解释......我不记得在埃里克的博客系列中看到过关于它的解释,尽管我很可能在某个地方错过了它。)

我想说的一件事是,委托和接口都已经在实际类型上形成了“间接层”;如果您愿意的话,可以查看对方法或类的看法。从一种观点转变为另一种观点是相当合理的。对我来说,实际的类感觉像是一种更具体的表示——从一种具体表示转换到另一种感觉不太合理。但这是一个非常敏感的解释,而不是真正的技术限制。


2
投票
为什么 C# (4.0) 不允许泛型类类型中存在协变和逆变?

以获取更多评论。

© www.soinside.com 2019 - 2024. All rights reserved.