当接口方法没有参数时,为什么实现不能识别具有所有可选参数的方法?
本文关键字:方法 参数 识别 为什么 接口 实现 不能 | 更新日期: 2023-09-27 18:01:58
我一直在摆弄可选参数,遇到了以下场景:
如果我的类中有一个方法,其中所有参数都是可选的,我可以编写以下代码:
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类实现这个接口,那么它不会编译,因为它说接口成员A()来自iinterface是不实现的。为什么接口实现没有解析为具有所有可选参数的方法?
这是两种不同的方法。一个有两个参数,一个没有参数。可选参数只是语法糖。您的方法B
将被编译为以下内容:
public void B()
{
Test test = new Test();
Console.WriteLine(test.A(7, 6));
}
您可以通过查看生成的IL代码来验证这一点。
您可能想要阅读Eric Lippert关于这个主题的四部分系列博客文章。它展示了这样的极端情况,并将允许您理解为什么这些实际上是不同的方法。
http://ericlippert.com/2011/05/09/optional-argument-corner-cases-part-one/一旦你需要Test来实现iinterface,你现在就有了一个不符合契约的类。必须显式地满足接口。编译器不会确定A()和A(int foo = 7, int bar = 6)是相同的,因为它们不是。它们有两个不同的签名,一个不允许任何参数,另一个在没有提供值的情况下提供默认值。