【问题标题】:Why the output default value is from Base class?为什么输出默认值来自基类?
【发布时间】:2020-01-20 06:47:32
【问题描述】:

为什么输出是B5,谁能解释一下?

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();
        }
}
//Output is : B5

我希望输出是 B6,但实际输出是 B5。

【问题讨论】:

  • 它是编译器错误吗?我在 VS2017 中调试代码,并在 B.M() 上按预期调用断点,但 x 实际上是 5,因为方法签名指示 6... 存在默认参数值的多态性中断。编译器至少应该在默认值更改或按预期使用时发出警告。
  • 是的,这就是问题所在:这是一个错误还是这种行为背后有某种意义。解释很简单,但我的问题是为什么它会这样工作。希望有人能回答这个问题。

标签: c# .net


【解决方案1】:

默认参数不会像您期望的那样工作。 它们是在编译期间硬连线到方法调用中的常量。并且在编译过程中,唯一已知的类型是 A。

您的代码相当于:

   static void Main(string[] args)
    {
        A a = new B();
        a.M(5);
    }

【讨论】:

  • 感谢您的回答。你能提供更多关于这方面的细节吗?为什么会发生这种情况,这是正常的,还是打印 Derived 类的默认值更准确?提前致谢
猜你喜欢
  • 2021-02-01
  • 2019-04-21
  • 1970-01-01
  • 2018-02-08
  • 1970-01-01
  • 2018-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多