在这种情况下,为什么C#无法解决正确的重载?

时间:2015-02-24 13:29:16

标签: c# delegates overload-resolution

我遇到了一个非模糊的奇怪情况,但过载解析器并不这么认为。考虑:

public static class Program
{
    delegate int IntDel();
    delegate string StringDel();

    delegate void ParamIntDel(int x);
    delegate void ParamStringDel(string x);

    static void Test(IntDel fun) { }
    static void Test(StringDel fun) { }
    static void ParamTest(ParamIntDel fun) { }
    static void ParamTest(ParamStringDel fun) { }

    static int X() { return 42; }
    static void PX(int x) { }

    public static void Main(string[] args)
    {
        ParamTest(PX); // OK
        Test(X); // Ambiguos call!
    }
}

如何正确解决对ParamTest重载的调用,但Test重载是不明确的?

1 个答案:

答案 0 :(得分:37)

也许是因为https://msdn.microsoft.com/en-us/library/aa691131%28v=vs.71%29.aspx

  

方法的签名特别不包括返回类型,也不包括可能为最右边的参数指定的params修饰符。

IntDelStringDel之间的唯一区别在于返回值。

更具体地说:https://msdn.microsoft.com/en-us/library/ms173171.aspx

  

在方法重载的上下文中,方法的签名不包括返回值。但是在委托的上下文中,签名确实包含返回值。换句话说,方法必须具有与委托相同的返回类型。