Чтобы уточнить, я интерпретирую вопрос следующим образом:
Если метод определен в интерфейсе / базовом классе, у которого есть метод, имеющий параметр со значением по умолчанию, и класс реализует / переопределяет этот метод, но предоставляет другое значение по умолчанию, почему компилятор не предупреждает?
Обратите внимание, что это не охватывает случай, когда реализация не ' any значение по умолчанию - этот случай объясняется Eri c Lippert .
Я спросил об этом на канале gitter csharplang , и ответ от кого-то, кто долгое время активно участвовал в разработке языка, был:
Я думаю, что анализатор звучит очень хорошо для этого.
Исходя из этого и других ссылок, размещенных здесь (которые даже не упоминают этот конкретный случай c), я думаю, что этот конкретный случай c просто не рассматривался или был кратко рассмотрен, но отклонен как тоже ниша Конечно, после выпуска C# 4 не было никакого способа добавить ошибку или предупреждение компилятора, не нарушая обратную совместимость.
Вы могли бы написать анализатор, который ловит этот случай (в котором было исправление кода, чтобы исправить значение по умолчанию), и попробуйте включить его в Roslyn.
В качестве сноски я вижу несколько случаев, которые могут вызвать проблемы.
Интерфейс изменяет интерфейс значение по умолчанию для одного из его параметров
Это уже бинарное изменение, и это приведет к изменению источника.
Два интерфейса с разными значениями по умолчанию
interface I1
{
void Foo(bool x = false);
}
interface I2
{
void Foo(bool x = true);
}
class C : I1, I2
{
...?
}
Если вы хотите указать значение по умолчанию для C.Foo
, этот случай может быть решен путем явной реализации одного из интерфейсов:
class C : I1, I2
{
public void Foo(bool x = false) { ... }
void I2.Foo(bool x) => Foo(x);
}
В качестве альтернативы вы можете просто проигнорировать этот случай, и не предупреждаю.
Добавление интерфейса в дочерний класс
interface I1
{
void Foo(bool x = false);
}
class Parent
{
public void Foo(bool x = true) { ... }
}
class Child : Parent, I1
{
...?
}
Я не уверен, каким будет интуитивное решение, но так как это поэтому нишу я бы соблазнил просто игнорировать и не предупреждать.