Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重载方法的调用不明确错误,该方法接受两个具有不同返回类型的委托_C# - Fatal编程技术网

C# 重载方法的调用不明确错误,该方法接受两个具有不同返回类型的委托

C# 重载方法的调用不明确错误,该方法接受两个具有不同返回类型的委托,c#,C#,我正在尝试设置一个重载方法,该方法将接受两种不同类型的委托。委托仅在返回类型上有所不同——在这两种情况下,它们都不接受输入参数。因此,在上面的示例中,我希望能够调用Test()并将返回void的方法或返回int的方法传递给它 错误CS0121:呼叫不明确 在下列方法之间或 特性: 'ConsoleApplication1.Program.Test(ConsoleApplication1.Program.VoidMethodDelegate)' 和 'ConsoleApplication1.Pro

我正在尝试设置一个重载方法,该方法将接受两种不同类型的委托。委托仅在返回类型上有所不同——在这两种情况下,它们都不接受输入参数。因此,在上面的示例中,我希望能够调用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创建委托,而不是直接传递方法,我可以解决这些错误,如下所示:

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));
    }