我注意到,对于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框架来注入具体类),那么拥有默认值就没有意义,因为调用方无论如何都必须提供它.