我一直在玩可选参数,并且遇到以下情况。
如果我的类上有一个方法,其中所有参数都是可选的,我可以编写以下代码:
public class Test
{
public int A(int foo = 7, int bar = 6)
{
return foo*bar;
}
}
public class TestRunner
{
public void B()
{
Test test = new Test();
Console.WriteLine(test.A()); // this recognises I can call A() with no parameters
}
}
如果我然后创建一个界面,如:
public interface IAInterface
{
int A();
}
如果我让Test类实现这个接口,那么它将不会编译,因为它说来自IAInterface的接口成员A()没有实现。为什么接口实现没有被解析为具有所有可选参数的方法?
答案 0 :(得分:4)
这是两种不同的方法。一个有两个参数,一个有零。可选参数只是语法糖。您的方法B
将编译为以下内容:
public void B()
{
Test test = new Test();
Console.WriteLine(test.A(7, 6));
}
您可以通过查看生成的IL代码来验证这一点。
答案 1 :(得分:1)
您可能想阅读Eric Lippert关于此主题的四篇系列博客文章。它显示了这种极端情况,并允许您理解为什么这些实际上是不同的方法。
http://ericlippert.com/2011/05/09/optional-argument-corner-cases-part-one/
答案 2 :(得分:0)
一旦您需要Test来实现IAInterface,您现在就拥有了一个不符合合同的类。必须明确满足接口。编译器不会确定A()和A(int foo = 7,int bar = 6)是否相同,因为它们不是。它们有两个不同的签名,一个不允许任何参数,另一个在没有提供值的情况下提供默认值。