当接口方法没有参数时,为什么实现不能识别具有所有可选参数的方法?

本文关键字:方法 参数 识别 为什么 接口 实现 不能 | 更新日期: 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)是相同的,因为它们不是。它们有两个不同的签名,一个不允许任何参数,另一个在没有提供值的情况下提供默认值。