В следующем коде вызов метода2 принимает параметр значения как False, хотя базовый класс вообще не объявляет значение по умолчанию для параметра, а производный класс объявляет True как значение по умолчанию.
Можно было бы утверждать (как это было сделано в аналогичном примере здесь: необязательные параметры С# при переопределенных методах), что компилятор сначала использует объявление метода базового класса (что true, так как это поведение может быть изменено путем префикса вызова метода Method1 с помощью this.
), но в этом случае база вообще не объявляет значение по умолчанию.
Есть ли рациональное объяснение этому?
using System;
class Base
{
public virtual bool Method1(bool Value) { return true; }
public virtual bool Method2(bool Value) { return true; }
}
class Derived : Base
{
public override bool Method1(bool Value = true)
{
return Value;
}
public override bool Method2(bool Value = true)
{
return Method1();
}
}
class Program
{
static void Main(string[] args)
{
Derived a = new Derived();
Console.WriteLine("Call to Method1, expected: True, got: {0}", a.Method1());
Console.WriteLine("Call to Method2, expected: True, got: {0}", a.Method2());
}
}
Вывод:
Call to Method1, expected: True, got: True Call to Method2, expected: True, got: False