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

soc*_*soc 11 c# clr covariance contravariance c#-4.0

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

这与C#4.0中委托合并的混乱变化有关吗?

编辑:如果没有在CLR上运行的限制,是否可以使用使用共同/逆变的语言?

kem*_*002 8

你将要阅读Eric Lippert关于它为何如此工作的帖子.缺点是它们允许尽可能多的差异,而不允许开发人员在编程中犯下可能导致难以追踪错误的错误.4.0中的差异量大大超过了3.0规则,从我的理解来看,它是对开发人员有利的东西和允许安全的东西之间的平衡,而不会因无意识的错误而引起太多的麻烦.

http://blogs.msdn.com/b/ericlippert/archive/tags/covariance+and+contravariance/default.aspx

  • Java和.NET泛型以完全不同的方式实现 - Java是编译时,.NET是运行时.添加功能(类方差)总是会产生更多的工作和更多要考虑的问题. (3认同)

Jon*_*eet 5

简单回答:这是一个CLR限制.

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

有一件事我说的是,无论是代表和接口已经形成了真正的类型"间接层"; 如果愿意,可以查看方法或类.从一个视图转换到另一个视图是相当合理的.对于我来说,实际的阶级感觉就像是一个更具体的表现形式 - 从一个具体的表现形式转移到另 这是一个非常敏感的解释,而不是真正的技术限制.