4

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

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

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 个参数的短方法。当然,所有这些都以相同的方式工作并且没有接口。

谢谢

4

2 回答 2

3

这归结为编译器如何处理命名参数和可选参数
查看MSDN 上的这篇文章以获取更多信息,尤其是Overload Resolution段落。

如果两个候选者被判断为同样好,则优先考虑没有可选参数的候选者,在调用中省略了这些参数。这是对具有较少参数的候选者的重载解决方案的普遍偏好的结果。

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

于 2011-05-16T12:34:32.843 回答
1

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

于 2011-05-16T12:24:45.070 回答