带有重载方法的模糊调用错误,需要2个具有不同返回类型的委托

时间:2010-08-10 13:10:04

标签: c#

class Program
{
    public delegate void VoidMethodDelegate();
    public delegate int IntMethodDelegate();

    static void Main(string[] args)
    {
        Test(IntMethod);
        Test(VoidMethod);
    }

    static int IntMethod()
    {
        return 1;
    }

    static void VoidMethod()
    {
    }

    static void Test(VoidMethodDelegate method)
    {
    }

    static void Test(IntMethodDelegate method)
    {
    }
}

我正在尝试设置一个重载方法,它将采用两种不同类型的委托。代表只有返回类型不同 - 在这两种情况下它们都不带输入参数。因此,在上面的示例中,我希望能够调用Test()并将其传递给返回void的方法或返回int的方法。当我编译上面的代码时,我得到了这些错误:

  

错误CS0121:呼叫不明确   以下方法之间或   特性:   'ConsoleApplication1.Program.Test(ConsoleApplication1.Program.VoidMethodDelegate)'   和   'ConsoleApplication1.Program.Test(ConsoleApplication1.Program.IntMethodDelegate)'

     

错误CS0407:'int   ConsoleApplication1.Program.IntMethod()”   有错误的返回类型

     

错误CS0121:呼叫不明确   以下方法之间或   特性:   'ConsoleApplication1.Program.Test(ConsoleApplication1.Program.VoidMethodDelegate)'   和   'ConsoleApplication1.Program.Test(ConsoleApplication1.Program.IntMethodDelegate)'

我知道如果我使用 new 创建委托而不是直接传递方法,我可以解决错误,如下所示:

    static void Main(string[] args)
    {
        Test(new IntMethodDelegate(IntMethod));
        Test(new VoidMethodDelegate(VoidMethod));
    }

但是这种语法很混乱,我宁愿能够直接传递方法,而不必将其包装在对 new 的调用中。我见过的唯一解决方案是摆脱Test()的重载版本,而是使用两种不同的方法,每种方法都有不同的名称。

有谁能告诉我为什么编译器抱怨这是不明确的?我不明白为什么编译器无法决定使用哪两个重载。

1 个答案:

答案 0 :(得分:7)

基本上,这是如何执行重载以及如何解决方法组转换的必然结果。如果你愿意,我可以尝试通过规范来查找完全的原因,但坏消息是它就是这样的。它可能可能在这种情况下存在一个编译器错误,但它更可能只是一个棘手的规范。

认为 this SO question may be relevant,但我还没有检查过。

我建议您选择使用不同的方法名称,而不是使用new解析它。重载具有各种偷偷摸摸的极端情况 - 这个至少是相对无害的,因为它导致编译时错误,而不是在执行时选择你不想要的重载。删除重载通常是件好事:)

编辑:我很确定其他SO问题实际上是相关的。我建议你给自己喝杯咖啡,C#4规格,然后仔细阅读Eric的回答。然后更改方法名称,这样就不必再考虑它了。