在C#中重写默认参数

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
按照谁的预期输出? - Jamiec
我认为在覆盖方法时更改可选参数的默认值是无效的。这不会改变方法签名吗? - Frederik Gheysels
1
@user1567896,如果它无效,我怀疑它会。 - Marc Gravell
实际上,当代码无效时编译器应该报错。虽然它没有报错,但是 Resharper 会提示错误。 - Frederik Gheysels
1
@Frederik,这并不是无效的,只是可能不明智 - Rawling
显示剩余3条评论
1个回答

12

你为什么希望期望 "bbb bbb"?

因为你将实例转换为 a,在第一次调用时,编译器只知道具有"aaa"版本的信息,所以使用该值

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

多态性影响调用的方法 - 但不影响传递的参数。本质上,编译器在调用现场提供默认值,因此您的代码实际上等同于:

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

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


3
因此,再强调一下,默认值是在编译时实现的,而不是运行时实现的? - Boluc Papuccuoglu
1
@BolucPapuccuoglu 是的,我已经添加了一些内容来突出显示。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接