Ответ 1
Похоже, это тип ошибки.
Вот ссылка, о которой вы, ребята, говорили, я думаю, что она была в начале этого года:
В следующем коде вызов метода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
Похоже, это тип ошибки.
Вот ссылка, о которой вы, ребята, говорили, я думаю, что она была в начале этого года:
Кажется, что ваш вопрос связан с этим другим вопросом, который может вам помочь: Неоднозначность с наследованием базового метода необязательного параметра
Я только что установил RTM для Visual Studio 2012, и тот же код работает, как и ожидалось, даже при компиляции для Framework 3.5 или 2.0. По-видимому, это проблема компилятора, а не .Net Framework one и была исправлена в новой версии компилятора С#.