В следующем коде вызов Method2 получает параметр Value как False, хотя базовый класс вообще не объявляет значение по умолчанию для параметра, а производный класс объявляет True как значение по умолчанию.
Можно утверждать (, как это было сделано в аналогичном примере здесь:C #необязательные параметры переопределенных методов)что компилятор сначала использует объявление метода базового класса (, что верно, поскольку это поведение можно изменить, поставив перед вызовом 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