C# 重载方法的调用不明确错误,该方法接受两个具有不同返回类型的委托
我正在尝试设置一个重载方法,该方法将接受两种不同类型的委托。委托仅在返回类型上有所不同——在这两种情况下,它们都不接受输入参数。因此,在上面的示例中,我希望能够调用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创建委托,而不是直接传递方法,我可以解决这些错误,如下所示:C# 重载方法的调用不明确错误,该方法接受两个具有不同返回类型的委托,c#,C#,我正在尝试设置一个重载方法,该方法将接受两种不同类型的委托。委托仅在返回类型上有所不同——在这两种情况下,它们都不接受输入参数。因此,在上面的示例中,我希望能够调用Test()并将返回void的方法或返回int的方法传递给它 错误CS0121:呼叫不明确 在下列方法之间或 特性: 'ConsoleApplication1.Program.Test(ConsoleApplication1.Program.VoidMethodDelegate)' 和 'ConsoleApplication1.Pro
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)
{
}
}
但这种语法很混乱,我更希望能够直接传递该方法,而不是将其包装在对new的调用中。我看到的唯一解决方案是摆脱Test()的重载版本,而是使用两个不同的方法,每个方法都有不同的名称
有人能告诉我为什么编译器抱怨这是不明确的吗?我不明白为什么编译器不能决定使用这两个重载中的哪一个。基本上这是如何执行重载以及如何解决方法组转换的必然结果。如果你愿意的话,我可以试着浏览一下规范,找出确切的原因,但坏消息是,事情就是这样。在这种情况下可能存在编译器错误,但更可能的是它只是规范中的一个棘手的部分 我想是的,但我还没查过 我建议您选择使用不同的方法名称,而不是使用
new
。重载有各种各样的隐蔽情况——这一种至少相对无害,因为它会导致编译时错误,而不是在执行时选择不需要的重载。消除过载通常是一件好事:)
编辑:事实上,我很确定其他问题是相关的。我建议你喝杯咖啡,C#4规格,然后仔细阅读Eric的答案。然后更改方法名称,这样您就不必再考虑它了。谢谢您的链接,我在最初的搜索中错过了这个链接。我同意使用不同的命名方法,这就是我最终要做的,我只是想确保我没有遗漏一些明显的东西。可能的重复不知道它有多漂亮,但不是
Test(new IntMethodDelegate(IntMethod))
您可以使用Test((IntMethodDelegate)IntMethod)代码>。从方法组到委托类型的转换通常是隐式的,但也可以使用(显式的)强制转换语法(在本例中必须使用)。
static void Main(string[] args)
{
Test(new IntMethodDelegate(IntMethod));
Test(new VoidMethodDelegate(VoidMethod));
}