带接口的C#重载方法行为

时间:2011-05-16 12:19:12

标签: c# .net interface overloading overload-resolution

  

可能重复:
  C# 4: conflicting overloaded methods with optional parameters

我只进行了一项小型研究并创建了下一个代码。

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

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

由于

2 个答案:

答案 0 :(得分:2)

这归结为编译器如何处理命名参数和可选参数 请查看this article at MSDN以获取更多信息,尤其是段落重载决策

  

如果两个候选人被判断为同样好,则优先选择没有可选参数的候选人,其中参数在调用中被省略。这是对具有较少参数的候选者的重载分辨率的一般偏好的结果。

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

答案 1 :(得分:1)

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