覆盖C#中的默认参数

时间:2013-12-17 12:20:44

标签: c# default-parameters

复制起来非常简单,输出很奇怪;

预期输出为“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);
    }
}

1 个答案:

答案 0 :(得分:12)

你为什么期待“bbb bbb”?

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

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

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

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

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