为何输出为B5?C#虚方法默认参数值问题咨询
为什么重写方法的默认参数值会取基类的?
先看你给出的代码:
class A { public virtual void M(int x=5) => Console.Write("A"+x); } class B:A { public override void M(int x=6) => Console.Write("B"+x); } class Program { static void Main(string[] args) { A a = new B(); a.M(); } }
运行这段代码会输出 B5,而非你预期的 B6,这本质是C#默认参数的绑定规则导致的,核心逻辑可以拆解成两点:
- 默认参数值是编译时确定的:当你写
a.M()时,编译器只认变量的静态类型(也就是声明时的A),不管运行时实际实例是B。它会直接把基类A里定义的默认值5硬编码到调用逻辑里,相当于把代码改成了a.M(5)。 - 方法重写是运行时多态:虽然参数值在编译阶段就定死了,但运行时会根据实例的实际类型调用对应的重写方法——这就是为什么你会看到输出开头的
B,但参数还是用了基类的默认值。
如果想让代码输出 B6,你需要让编译器识别到变量的静态类型是 B,比如:
B b = new B(); b.M(); // 这里会输出 B6
或者直接显式传递参数,彻底绕开默认值的绑定逻辑。
内容的提问来源于stack exchange,提问作者David Mosyan
相关产品推荐
相关产品推荐

