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 回答