15

次のコードでは、基本クラスがパラメーターのデフォルト値をまったく宣言せず、派生クラスが True をデフォルトとして宣言しているにもかかわらず、Method2 の呼び出しは Value パラメーターを False として受け取ります。
コンパイラは基本クラスのメソッド宣言を最初に使用すると主張することができます (同様の例で行われたように: C# オーバーライドされたメソッドのオプション パラメーター) (この動作は Method1 への呼び出しの前に を付けることで変更できるため、これは事実ですthis.)。この場合、ベースはデフォルト値をまったく宣言しません。
これについて合理的な説明はありますか?

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 に答える