复制起来非常简单,输出很奇怪;
预期输出为“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);
}
}
答案 0 :(得分:12)
你为什么期待“bbb bbb”?
由于您要将实例强制转换为a
,因此第一次调用时编译器的唯一信息是带有"aaa"
的版本,因此该值是使用的
在没有强制转换的第二个版本中,编译器可以看到"bbb"
,因此该值是使用的。
多态性会影响调用哪种方法 - 但它不会影响传递的参数。基本上,默认值由编译器提供 (在调用站点),因此您的代码实际上等同于:
((a)new b()).test("aaa");
new b().test("bbb");
通过检查已解析的方法,"aaa"
和"bbb"
在编译时提供 。