значение параметра по умолчанию в переопределенных методах

В следующем коде вызов 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

15
задан Community 23 May 2017 в 10:24
поделиться