You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何输出为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:59:09