为什么C#/ CLR不支持方法重写CO /禁忌变化?为什么C#/ CLR不支持方法重写CO /禁忌变

2019-05-12 11:08发布

大约有各地的不允许C#方法的返回(及参数)类型改为兼容类型上覆盖的限制黑客不少问题和答案,但这种限制存在,无论是在C#编译器或CLR? 正如我在看看,有没有什么如有合作/禁忌方差被允许,可以突破,那么什么是其背后的原因何在呢?

类似的问题可能会被要求扩大接入参数 - 例如覆盖一个受保护的内部方法与公共方法(一些东西,Java支持,IIRC)

Answer 1:

比我埃里克利珀已经回答了这个办法好。

看看他的一系列协变和逆变的C#

如何C#4.0泛型协方差和孔特拉方差Implmeneted?

编辑:埃里克指出,他不谈论返回类型convariance但我决定继续在这个答案的链接,因为它是一个很酷的系列文章,有人可能会发现它有用,如果查找这个话题。

此功能已被要求和近5年前,微软已经回答说:“谢谢你记录此,我们听到这个要求很多,我们会考虑的下一个版本。”

现在我还要举乔恩斯基特,因为它不会在计算器上一个合适的回答,而不由乔恩飞碟双向的答案。 协方差和无效的返回类型

我强烈怀疑,答案就在CLR的实现,而不是在任何深层语义原因 - CLR可能需要知道是否有将是一个返回值,以做适当的事情堆栈。 即便如此,似乎有点可惜的,在优雅的条款。 我不能说我曾经觉得这方面的需要在现实生活中,这将是相当容易伪造(最多四个参数)在.NET 3.5只写从转换器Func<X>Action<X> Func<X,Y>Action<X,Y>等。niggles一点虽然:)



Answer 2:

这个答案是不是在谈论C#,但它帮助我理解这些问题更好,也许它会帮助别人: 为什么没有参数禁忌方差重写?



Answer 3:

接缝引入返回值的协方差具有如Java和C ++已经使用没有本质的缺点。 然而,有通过引入形式参数的禁忌方差套管真正的混乱。 我想这个答案https://stackoverflow.com/a/3010614/1443505在C ++中也同样适用于C#。



Answer 4:

它,你只需要等待VS2010 / .NET 4.0。



Answer 5:

为了扩大对乔尔的回答 - 在CLR已经支持有限方差的很长一段时间,但C#编译器不使用它们,直到4.0与新的“in”和泛型接口和委托“走出去”修饰。 其原因是复杂的,我会陷入一片混乱试图解释,但它并不像看起来那么简单。

重新制作一个“受保护的内部”方法为“公共”的方法; 你可以用方法隐藏做到这一点:

public new void Foo(...) { base.Foo(...); }

(只要参数等都是公众也) - 有什么用处?



文章来源: Why does C#/CLR not support method override co/contra-variance?