Я заметил, что с необязательными параметрами в C # 4, если вы указываете необязательный параметр на интерфейсе, который вам не нужен, вы должны сделать этот параметр необязательным для любого реализующего класса:
public interface MyInterface
{
void TestMethod(bool flag = false);
}
public class MyClass : MyInterface
{
public void TestMethod(bool flag)
{
Console.WriteLine(flag);
}
}
и поэтому:
var obj = new MyClass();
obj.TestMethod(); // compiler error
var obj2 = new MyClass() as MyInterface;
obj2.TestMethod(); // prints false
Кто-нибудь знает, почему дополнительные параметры предназначены для работы таким образом?
С одной стороны, я полагаю, что возможность переопределения любых значений по умолчанию, указанных на интерфейсах, полезна, хотя, если честно, я не уверен, что вы даже сможете указать значения по умолчанию на интерфейсе, поскольку это должно быть решением о реализации.
С другой стороны, это отключение означает, что вы не всегда можете использовать конкретный класс и интерфейс взаимозаменяемо. Это, конечно, не будет проблемой, если в реализации указано значение по умолчанию, но если вы представляете конкретный класс в качестве интерфейса (например, с помощью некоторой инфраструктуры IOC для внедрения конкретного класса), то на самом деле нет точка, имеющая значение по умолчанию, так как вызывающая сторона должна всегда предоставлять его в любом случае.
MyInterface
и вызвать его с дополнительным параметром: ((MyInterface)obj).TestMethod();
.