Именованные параметры C #, неожиданность наследования и перегрузки

#inheritance #c#-4.0 #named-parameters #overloading

#наследование #c #-4.0 #именованные параметры #перегрузка

Вопрос:

Я просматривал некоторую презентацию, касающуюся C # 4.0, и в конце докладчик опубликовал тест со следующим кодом.

 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
  

Я искал в сети ответ, но все еще не мог его найти. Может ли кто-нибудь объяснить это?

Комментарии:

1. Это не имеет ничего общего с именованными параметрами. Узнайте, что такое полиморфизм.

2. Проблема в том, что любой разработчик ожидал бы производных. Foo должен вызываться из-за полиморфизма. Поэтому для кого-то нормально думать, что именованные параметры в производном. Будет принят Foo. Но поскольку это полиморфизм среды выполнения, компилятор использует имена параметров из Base.Foo.

Ответ №1:

Причина, по-видимому, в следующем: вы вызываете Foo на Base , поэтому он принимает имена параметров из Base.Foo . Поскольку x это первый параметр, а y это второй параметр, этот порядок будет использоваться при передаче значений переопределенному методу.