Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.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# 分配给代理时返回值和签名的有效性--Func<;任务>;vs行动_C#_Return_Task_Overloading_Signatures - Fatal编程技术网

C# 分配给代理时返回值和签名的有效性--Func<;任务>;vs行动

C# 分配给代理时返回值和签名的有效性--Func<;任务>;vs行动,c#,return,task,overloading,signatures,C#,Return,Task,Overloading,Signatures,我惊讶地发现,当将方法传递给另一个方法时,方法上的返回类型会产生重载歧义。由于返回类型不是签名的一部分,因此很难看出更改返回值如何会在以前不存在的地方产生歧义。然而,这似乎是虚无和任务的情况。考虑以下事项: class Signature { static public void Overload(Func<Task> countasync) { } static public void Overload

我惊讶地发现,当将方法传递给另一个方法时,方法上的返回类型会产生重载歧义。由于返回类型不是签名的一部分,因此很难看出更改返回值如何会在以前不存在的地方产生歧义。然而,这似乎是虚无和任务的情况。考虑以下事项:

    class Signature
    {
        static public void Overload(Func<Task> countasync)
        {
        }
        static public void Overload(Action count)
        {
        }
    }

    void Decrement() { }
    Task IncrementAsync() { return Task.CompletedTask; }

    void TestSig()
    {
        Signature.Overload(this.IncrementAsync); // no compile time error
        Signature.Overload(this.Decrement); // compile time error: this call is ambiguous 
    }
类签名
{
静态公共void重载(Func countasync)
{
}
静态公共无效重载(操作计数)
{
}
}
无效减量(){}
任务增量异步(){return Task.CompletedTask;}
void TestSig()
{
Signature.重载(this.IncrementAsync);//无编译时错误
Signature.重载(this.Decrement);//编译时错误:此调用不明确
}

有没有一种方法可以定义重载参数类型,这样第二个调用就不会模棱两可,同时仍然允许第一个调用

不,无法修复过载分辨率

但是,您可以以稍微丑陋的呼叫站点代码为代价来消除歧义:

Signature.Overload( () => this.Decrement() );

在这种情况下,编译器将正确地推断重载。

造成歧义的原因似乎是委托类型(与方法签名不同)是按返回类型和参数类型区分的。这样做的好处是,例如,您可以根据事件处理程序的返回类型拥有不同的事件类型。