17

重複の可能性:
オーバーライドされたメソッドの C# オプション パラメータ

これは、次のコードの出力です。

Peter: -1
Peter: 0
Fred: 1
Fred: 1

p.TellYourAge()ピーターとの呼び声がp.DoSomething()同一ではない理由を説明してもらえますか?

自分で試すためのコード (VS2010 および FW 4):

    static void Main(string[] args)
    {
        Peter p = new Peter();
        p.TellYourAge(); // expected -1, result: -1
        p.DoSomething(); // expected -1, result: 0

        Fred f = new Fred();
        f.TellYourAge(1); // expected 1, result: 1
        f.DoSomething(); // expected 1, result: 1

        Console.ReadKey();
    }
}

public abstract class Person
{
    public abstract void TellYourAge(int age); // abstract method without default value
}

public class Peter : Person
{
    public override void TellYourAge(int age = -1) // override with default value
    {
        Console.WriteLine("Peter: " + age);
    }

    public void DoSomething()
    {
        TellYourAge();
    }
}

public class Fred : Person
{
    public override void TellYourAge(int age) // override without default value
    {
        Console.WriteLine("Fred: " + age);
    }

    public void DoSomething()
    {
        TellYourAge(1);
    }
}
4

1 に答える 1

3

Resharper を使用すると、次の警告/通知が表示されます。

「オプション パラメータのデフォルト値が、基本メソッド void TellYourAge(int age) のパラメータ age と異なります。」

オプションのパラメーター値と継承を混在させる場合は注意してください。デフォルトのパラメーター値は、実行時ではなくコンパイル時に解決されます。デフォルトは、呼び出される参照型に属します。ここでは Person タイプに解決され、-1 ではなく 0 である整数のデフォルト値を使用します。

オプションのパラメーターに関する一般的な落とし穴に関する情報は、次の場所にあります。

http://geekswithblogs.net/BlackRabbitCoder/archive/2010/06/17/c-optional-parameters---pros-and-pitfalls.aspx

このように使用したい場合は、簡単に修正してください。メソッド TellYourAge を呼び出すときに、キーワード「this」を明示的に指定します。このようにして、目的のデフォルト値がコンパイル時に決定されます。

public void DoSomething()
{
    this.TellYourAge();
}
于 2012-03-05T15:38:47.953 に答える