3

与えられた:

interface IFoo
{
    void Print(string text = "abc");
}

class Bar : IFoo
{
    public void Print(string text = "def")
    {
        Console.WriteLine(text);
    }
}

class Program
{
    static void Main(string[] args)
    {
        Bar b = new Bar();
        b.Print();

        IFoo f = b as IFoo;
        f.Print();
    }
}

出力は次のとおりです。

def
abc

私だけですか、それともこれは少し奇妙ですか?最初は、どちらの場合も「def」を期待していました。ただし、そうなると、オプション引数の抽象メソッドは役に立たなくなります。しかし、それでも厄介なバグの良い出発点のようです。

4

1 に答える 1

7

オプションのパラメーターはコンパイラー機能であり、コンパイラーはコンパイル時に使用可能な型情報に対してのみ機能します。したがって、値は、実際の実行時型ではなく、操作している参照の型から取得されます。この単純なテストケースでは、静的分析を介して実際のタイプを見つけることができますが、実際のf例ではめったに機能しないため、実装されていません。

于 2010-09-18T22:48:11.023 に答える