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

发布于 2024-11-20 00:17:14 字数 581 浏览 2 评论 0原文

我一直在尝试使用可选参数并遇到以下场景。

如果我的类上有一个方法,其中所有参数都是可选的,我可以编写以下代码:

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() 未实现。为什么接口实现没有解析为具有所有可选参数的方法?

I've been playing around with optional parameters and came accross the following scenario.

If I have a method on my class where all the parameters are optional I can write the following code:

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
    }
}

If I then create an interface such as:

public interface IAInterface
    {
        int A();
    }

If I make the Test class implement this interface then it won't compile as it says interface member A() from IAInterface isn't implement. Why is it that the interface implementation not resolved as being the method with all optional parameters?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

笑着哭最痛 2024-11-27 00:17:14

这是两种不同的方法。一个有两个参数,一个有零。可选参数只是语法糖。您的方法 B 将被编译为以下内容:

public void B()
{
    Test test = new Test();
    Console.WriteLine(test.A(7, 6));
}

您可以通过查看生成的 IL 代码来验证这一点。

These are two different methods. One with two parameters, one with zero. Optional parameters are just syntactic sugar. Your method B will be compiled to the following:

public void B()
{
    Test test = new Test();
    Console.WriteLine(test.A(7, 6));
}

You can verify this by looking at the generated IL code.

风渺 2024-11-27 00:17:14

您可能想阅读 Eric Lippert 关于该主题的博客文章的四部分系列。它展示了此类极端情况,并使您能够理解为什么这些实际上是不同的方法。

http://ericlippert.com/2011/05/ 09/可选参数角点案例第一个/

You may want to read the four part series of blog posts by Eric Lippert on the subject. It shows such corner cases and will allow you to understand why those are actually different methods.

http://ericlippert.com/2011/05/09/optional-argument-corner-cases-part-one/

苏璃陌 2024-11-27 00:17:14

一旦您需要 Test 来实现 IAInterface,您现在就有一个不符合约定的类。接口必须明确满足。编译器不会确定 A() 和 A(int foo = 7, int bar = 6) 相同,因为它们不同。它们有两个不同的签名,一个不允许任何参数,另一个在未提供值时提供默认值。

Once you require Test to implement IAInterface you now have a class that does not meet the contract. The interface must be satisfied explicitly. The compiler won't determine that A() and A(int foo = 7, int bar = 6) are the same, because they are not. They have two distinct signatures, one that does not allow for any parameters and another that will supply defaults if values are not provided.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文