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

为什么C#4.0';s协方差/逆变仅限于参数化接口和委托类型?,c#,clr,c#-4.0,covariance,contravariance,C#,Clr,C# 4.0,Covariance,Contravariance,这是CLR的限制还是与现有代码存在兼容性问题 这是否与C#4.0中委托组合的混乱差异有关 编辑: 有没有可能在CLR上运行一种使用协变/逆变的语言,而不受该限制?你会想阅读Eric Lippert关于为什么它会这样工作的帖子。它的缺点是,它们允许尽可能多的差异,而不允许开发人员在编程中犯可能导致难以跟踪错误的错误。与3.0规则相比,4.0中的差异量大大增加,据我所知,这是对开发人员有利的内容与安全允许的内容之间的平衡,不会因无意中的错误而引起太多的头痛 简单回答:这是CLR限制 (我在任何地方都

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

这是否与C#4.0中委托组合的混乱差异有关

编辑:
有没有可能在CLR上运行一种使用协变/逆变的语言,而不受该限制?

你会想阅读Eric Lippert关于为什么它会这样工作的帖子。它的缺点是,它们允许尽可能多的差异,而不允许开发人员在编程中犯可能导致难以跟踪错误的错误。与3.0规则相比,4.0中的差异量大大增加,据我所知,这是对开发人员有利的内容与安全允许的内容之间的平衡,不会因无意中的错误而引起太多的头痛


简单回答:这是CLR限制

(我在任何地方都没有看到关于这一点的好的、具体的解释……我不记得在Eric的博客系列中看到过关于这一点的解释,尽管我可能在某个地方错过了。)


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

这是一个CLR限制。请参阅以获取更多评论。

C#代表差异“混乱”如何?@thecoop:注意Eric的评论说,代表组合在差异方面完全混乱-一般来说不是一般的代表。可能的重复可能的重复尽管我能理解关于可用性的担忧,Java早就有了这一功能,几乎没有什么问题。我可以想象,这种限制创造了比简化事情更复杂、更麻烦的解决办法。Java和.NET泛型是以完全不同的方式实现的——Java是编译时,.NET是运行时。添加特征(类方差)总是会产生更多的工作和更多的问题需要考虑。@ CooOP:你在回答你的开发者的观点,而不是在实现方面的技术上的困难。因此,如何在JVM/CLR上实现差异的实现细节并不是开发人员真正关心的问题,这听起来很糟糕。所以基本上微软重复了Sun在泛型上犯的错误?还是计划在未来的CLR更新中取消这一限制?实施并不是一个“错误”——这是他们考虑的一个明确的设计决策,他们有理由以这样的方式实施。@soc:这与Sun在泛型方面的错误完全不同。他们是否会在未来的版本中允许它是任何人的猜测。@thecoop:我不想争辩他们没有比较所有技术上可行的解决方案,并选择了他们认为最好的解决方案。但这正是Sun给我们的理由,当人们问他们为什么没有正确使用泛型时。我已经感觉到这个决定在几年后将是一个巨大的成就。@Jon Skeet:有趣。什么能使甲骨文考虑添加JVM支持,看到他们正在努力甚至获得闭包/山姆/“防御者”方法/扩展方法/尾部调用,对吗?