为什么在接口上定义的C#4可选参数没有被强制实现类?

我注意到,如果在一个接口中指定一个参数为可选参数,那么使用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 

有谁知道为什么可选参数devise为这样工作?

一方面,我认为能够重写在接口上指定的任何默认值是有用的,不过说实话,我不确定是否应该甚至能够在接口上指定默认值,因为这应该是实现的决定。

另一方面,这种断开意味着你不能总是交替地使用具体的类和接口。 这当然,如果在实现中指定了默认值,那么这个问题就不会成为问题,但是如果你将具体类作为接口公开(使用一些IOC框架来注入具体类),那么真的没有作为调用者必须始终提供默认值的点。

更新: 这个问题是我的博客在2011年5月12日的主题。感谢您的问题!

假设你有一个你所描述的接口,还有一百个实现它的类。 然后,您决定将其中一个接口方法的参数之一作为可选参数。 您是否build议正确的做法是让编译器强制开发人员find该接口方法的每个实现,并使该参数成为可选参数?

假设我们这样做了。 现在假设开发者没有实现的源代码:


 // in metadata: public class B { public void TestMethod(bool b) {} } 

 // in source code interface MyInterface { void TestMethod(bool b = false); } class D : B, MyInterface {} // Legal because D's base class has a public method // that implements the interface method 

D的作者应该如何做这个工作? 他们是否需要在你的世界中打电话给B的作者,并要求他们发送一个新版本的B,使该方法有一个可选参数?

这不会飞。 如果两个人打电话给B的作者,其中一个人想要默认是真的,其中一个人想要它是假的? 如果B的作者拒绝玩游戏呢?

也许在这种情况下,他们会被要求说:

 class D : B, MyInterface { public new void TestMethod(bool b = false) { base.TestMethod(b); } } 

提出的function似乎给程序员增加了许多不便,而代表性的功率没有相应的增加。 这个function有什么强大的好处可以certificate增加了用户的成本?

一个可选参数只是用一个属性标记的。 该属性告诉编译器在呼叫站点插入该参数的默认值。

调用obj2.TestMethod();obj2.TestMethod(false);replaceobj2.TestMethod(false); 当C#代码被编译为IL,而不是在JIT时间。

所以在某种程度上,调用者总是使用可选参数提供默认值。 这也会对二进制版本控制产生影响:如果更改默认值,但不重新编译调用代码,则将继续使用旧的默认值。

另一方面,这种断开意味着你不能总是交替地使用具体的类和接口。

如果接口方法是明确实现的 ,你已经做不到了。

因为默认参数在编译时parsing,而不是运行时。 所以默认值不属于被调用的对象,而是属于被调用的引用types。

可选参数有点类似于我所了解的macrosreplace。 从方法的angular度来看,它们并不是真正的可选项。 这是一个人为因素,你看到你得到不同的结果,如果你投到一个接口的行为。