15

在下面的代码中,对 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
4

2 回答 2

1

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

于 2012-08-15T19:54:33.377 回答
1

看起来这是一种错误。

这是你们正在谈论的链接,我认为是今年早些时候的链接:

覆盖方法上的 C# 可选参数

于 2012-08-07T22:00:26.717 回答