以下是剧透......
我正在考虑answer到#1,我必须承认我从来不知道重载解决方案就是这种情况。但为什么 这种情况。在我的小脑海中Derived.Foo(int)
似乎是合乎逻辑的道路。
这个设计决定背后的逻辑是什么?
奖金时间!
此行为是C#规范,CLR实现还是编译器的结果?
答案 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)
原因是:表现。 调用虚方法需要花费更多时间。在虚拟方法上调用委托会花费更多的时间等等......