C# 接口重载方法行为

发布于 2024-11-07 16:02:00 字数 1200 浏览 3 评论 0原文

可能的重复:
C# 4:与可选参数发生冲突的重载方法

我刚刚一项小研究并创建了下一个代码。

命名空间测试 {
班级计划
{
    公共接口ITestA
    {
        void MethodA(int a, int b);
    }

    公共类 TestAClass :ITestA
    {
        公共无效方法A(int a,int b)
        {
            Console.WriteLine("带有参数的方法A");
        }

        公共无效方法A(int a,int b,布尔逻辑= true)
        {
            Console.WriteLine("MethodA 带参数的逻辑");
        }
    }

    公共接口ITestB
    {
        void MethodA(int a, int b, bool 逻辑 = true);
    }

    公共类 TestBClass :ITestB
    {
        公共无效方法A(int a,int b)
        {
            Console.WriteLine("带有参数的MethodB");
        }         

        公共无效方法A(int a,int b,布尔逻辑= true)
        {
            Console.WriteLine("带有参数的MethodB逻辑");
        }
    }

    静态无效主(字符串[]参数)
    {
        var testA = new TestAClass();
        testA.MethodA(1, 1);            
        var testB = new TestBClass();
        testB.MethodA(1, 1);   
    }
} }

我有一个问题为什么编译器总是选择带有 2 个参数的短方法。当然,所有这些都以相同的方式工作,并且没有接口。

谢谢

Possible Duplicate:
C# 4: conflicting overloaded methods with optional parameters

I just have one small research and created next code.

namespace Test {
class Program
{
    public interface ITestA
    {
        void MethodA(int a, int b);
    }

    public class TestAClass : ITestA
    {
        public void MethodA(int a, int b)
        {
            Console.WriteLine("MethodA with param");
        }

        public void MethodA(int a, int b, bool logic = true)
        {
            Console.WriteLine("MethodA logic with param");
        }
    }

    public interface ITestB
    {
        void MethodA(int a, int b, bool logic = true);
    }

    public class TestBClass : ITestB
    {
        public void MethodA(int a, int b)
        {
            Console.WriteLine("MethodB with param");
        }         

        public void MethodA(int a, int b, bool logic = true)
        {
            Console.WriteLine("MethodB logic with param");
        }
    }

    static void Main(string[] args)
    {
        var testA = new TestAClass();
        testA.MethodA(1, 1);            
        var testB = new TestBClass();
        testB.MethodA(1, 1);   
    }
} }

I have a question why compiler always choose short method with 2 parameters. And of course all this work by the same way and without Interface.

Thanks

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

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

发布评论

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

评论(2

半窗疏影 2024-11-14 16:02:00

这归结为编译器如何处理命名参数和可选参数
请查看MSDN 上的这篇文章以获取更多信息,尤其是过载解决方案

如果两个候选者被认为同样优秀,则优先考虑没有可选参数且在调用中省略参数的候选者。这是重载决策中普遍偏好参数较少的候选者的结果。

这就是为什么在您的情况下编译器选择不带任何可选参数的方法。

This boils down to how the compiler treats named and optional parameters.
Check out this article at MSDN for more information, especially the paragraph Overload Resolution.

If two candidates are judged to be equally good, preference goes to a candidate that does not have optional parameters for which arguments were omitted in the call. This is a consequence of a general preference in overload resolution for candidates that have fewer parameters.

This is why in your case the compiler chooses the method without any optional parameters.

﹏半生如梦愿梦如真 2024-11-14 16:02:00

因为编译器找到一个与调用方法完全对应的方法并使用它。
如果第一种方法失败,编译器会搜索其他合适的方法......

Because compiler finds a method that correspond perfectly to calling method and use that.
Compiler searches for other suitable methods if first way fails...

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