方法超载分辨率和Jon Skeet的Brain Teasers

时间:2010-04-30 12:40:25

标签: c# operator-overloading

Jon's Brain Teasers

以下是剧透......

我正在考虑answer到#1,我必须承认我从来不知道重载解决方案就是这种情况。但为什么 这种情况。在我的小脑海中Derived.Foo(int)似乎是合乎逻辑的道路。

这个设计决定背后的逻辑是什么?

奖金时间!

此行为是C#规范,CLR实现还是编译器的结果?

5 个答案:

答案 0 :(得分:14)

这种行为是经过深思熟虑和精心设计的。原因是因为这种选择减轻了一种形式的脆性基类失效的影响。

阅读有关该主题的文章,了解更多详情。

http://blogs.msdn.com/ericlippert/archive/2007/09/04/future-breaking-changes-part-three.aspx

答案 1 :(得分:1)

这是一个可能的解释:

当编译器链接方法调用时,它首先查找继承链中最低的类(在本例中为Derived类)。它的实例方法被检查和匹配。重写方法Foo不是Derived的实例方法,它是Base类的实例方法。

正如Jack30lena提出的那样,可能是性能的原因,但它也可能是编译器如何解释编码器的意图。这是一个安全的假设,即开发人员的预期代码行为位于继承链底部的代码中。

答案 2 :(得分:1)

这是编译器的结果,我们检查了IL代码。

答案 3 :(得分:-1)

原因是因为它含糊不清。编译器必须决定一个。有人认为间接性越小越好(性能可能是一个原因)。 如果开发人员写了:

((Base)d).Foo (i);

很清楚并且给你预期的结果。

答案 4 :(得分:-3)

原因是:表现。 调用虚方法需要花费更多时间。在虚拟方法上调用委托会花费更多的时间等等......

请参阅: The cost of method calls