6

我正在通过一些关于C#4.0的演示文稿,最后演示者用以下代码发布了测验。C#命名参数,继承和超载意外

using System; 
class Base { 
    public virtual void Foo(int x = 4, int y = 5) { 
        Console.WriteLine("B x:{0}, y:{1}", x, y); 
    } 
} 

class Derived : Base { 
    public override void Foo(int y = 4, int x = 5) { 
        Console.WriteLine("D x:{0}, y:{1}", x, y); 
    } 
} 

class Program { 
    static void Main(string[] args) { 
        Base b = new Derived(); 
        b.Foo(y:1,x:0); 
    } 
} 

// The output is 
// D x:1, y:0 

我找不出为什么产生输出(在没有演示者的情况下脱机阅读演示文稿的问题)。我期待

D x:0, y:1 

我搜索了网络找到答案,但仍无法找到它。有人能解释这一点吗?

+0

这与命名参数无关。了解多态是什么。 – 2011-06-10 14:40:27

+0

问题是任何开发人员都会期望Derived.Foo因多态而被调用。因此,有人认为Derived.Foo中的命名参数将被采用是正常的。但是由于这是运行时多态,编译器使用Base.Foo中的参数名称。 – ferosekhanj 2011-06-13 06:15:38

回答

3

原因似乎如下:您在Base上调用Foo,因此它采用的参数名称为Base.Foo。因为x是第一个参数,y是第二个参数,所以在将值传递给overriden方法时将使用此顺序。