#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
это второй параметр, этот порядок будет использоваться при передаче значений переопределенному методу.