6

复制真的很简单,输出很奇怪;

预期输出为“bbb bbb” 实际输出为“aaa bbb”

有没有人对这种行为有任何 MSDN 解释?我找不到任何东西。

((a)new b()).test();
new b().test();


public class a
{
    public virtual void test(string bob = "aaa ")
    {
        throw new NotImplementedException();
    }
}

public class b : a
{
    public override void test(string bob = "bbb ")
    {
        HttpContext.Current.Response.Write(bob);
    }
}
4

1 回答 1

12

你为什么期待“bbb bbb”?

由于您将实例转换为a,编译器在第一次调用时的唯一信息是版本"aaa",因此该值就是使用的值

在没有强制转换的第二个版本中,编译器可以看到"bbb",所以那个值就是使用的

多态性会影响调用哪个方法- 但不会影响传递的参数。本质上,默认值由编译器(在调用站点)提供,因此您的代码实际上等效于:

((a)new b()).test("aaa");
new b().test("bbb");

通过检查已解决的方法,在编译时提供"aaa"and 。"bbb"

于 2013-12-17T12:26:07.730 回答