【问题标题】:default parameter value in overridden methods重写方法中的默认参数值
【发布时间】:2012-08-04 22:45:54
【问题描述】:

在下面的代码中,对 Method2 的调用将 Value 参数接收为 False,即使基类根本没有为参数声明默认值,而派生类将 True 声明为默认值。
可以说(就像这里的类似示例中所做的那样:C# optional parameters on overridden methods)编译器首先使用基类的方法声明(这是真的,因为可以通过在对 Method1 的调用前加上 this. 来改变这种行为) ,但在这种情况下,base 根本没有声明默认值。
对此有合理的解释吗?

using System;

class Base
{
    public virtual bool Method1(bool Value) { return true; }
    public virtual bool Method2(bool Value) { return true; }
}

class Derived : Base
{
    public override bool Method1(bool Value = true)
    {
        return Value;
    }

    public override bool Method2(bool Value = true)
    {
        return Method1();
    }
}

class Program
{
    static void Main(string[] args)
    {
        Derived a = new Derived();
        Console.WriteLine("Call to Method1, expected: True, got: {0}", a.Method1());
        Console.WriteLine("Call to Method2, expected: True, got: {0}", a.Method2());
    }
}

输出:

调用 Method1,预期:True,得到:True 调用 Method2,预期:True,得到:False

【问题讨论】:

  • 这不是我得到的输出。我收到“调用 Method1,预期:True,得到:True 调用 Method2,预期:True,得到:True”。您确定正是您正在运行的代码吗?诚然,我使用的是 C# 5 beta 编译器,所以可能已经修复了……
  • 呃- 你确定这是你得到的吗?我面前没有 C# 编译器,但我真的倾向于怀疑它 - 在 Method2 的主体中对 Method1 的调用只能解析为具有默认(true)参数的覆盖副本。编辑:(换句话说,@JonSkeet 所说的 :-))
  • .Net 4.0 我得到了与@andrei 相同的结果。
  • 回想起来,我很确定我以前见过这个错误 - 在 Stack Overflow 上报告过,并已针对 C# 5 编译器进行了修复。嗯。
  • @Andrei:我说的是这一段:“确实,情况变得更糟了:如果您在 Derived 中为参数提供默认值,但在 Base 中强制要求,则调用M() 最终使用 null 作为参数值。如果没有别的,我会说这证明这是一个错误:空值不能来自任何有效的地方。(它是 null,因为这是默认值string 类型的值;它始终只使用参数类型的默认值。)“正是您在讨论的内容。您在基类中有一个强制参数,并且您正在观察参数类型的默认值

标签: c# .net overriding virtual optional-parameters


【解决方案1】:

看起来这是一种错误。

这是你们谈论的链接,我想是今年早些时候的:

C# optional parameters on overridden methods

【讨论】:

    【解决方案2】:

    我刚刚安装了 Visual Studio 2012 RTM,即使针对 Framework 3.5 或 2.0 编译,相同的代码也能按预期工作。 所以显然这是一个编译器问题,而不是 .Net Framework 问题,并且已在新版本的 C# 编译器中修复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-18
      • 2022-01-18
      • 2021-11-18
      • 2016-12-10
      • 2018-08-14
      • 1970-01-01
      • 2016-06-15
      • 1970-01-01
      相关资源
      最近更新 更多