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

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

Ответы

Ответ 3

Я только что установил RTM для Visual Studio 2012, и тот же код работает, как и ожидалось, даже при компиляции для Framework 3.5 или 2.0. По-видимому, это проблема компилятора, а не .Net Framework one и была исправлена ​​в новой версии компилятора С#.