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()的重载版本,而是使用两种不同的方法,每种方法都有不同的名称。
有谁能告诉我为什么编译器抱怨这是不明确的?我不明白为什么编译器无法决定使用哪两个重载。
答案 0 :(得分:7)
基本上,这是如何执行重载以及如何解决方法组转换的必然结果。如果你愿意,我可以尝试通过规范来查找完全的原因,但坏消息是它就是这样的。它可能可能在这种情况下存在一个编译器错误,但它更可能只是一个棘手的规范。
我认为 this SO question may be relevant,但我还没有检查过。
我建议您选择使用不同的方法名称,而不是使用new
解析它。重载具有各种偷偷摸摸的极端情况 - 这个至少是相对无害的,因为它导致编译时错误,而不是在执行时选择你不想要的重载。删除重载通常是件好事:)
编辑:我很确定其他SO问题实际上是相关的。我建议你给自己喝杯咖啡,C#4规格,然后仔细阅读Eric的回答。然后更改方法名称,这样就不必再考虑它了。