Return 分配给委托时的值和签名歧义 -- Func<Task> 与 Action
Return value and signature abiguity when assigning to delegates -- Func<Task> vs Action
我惊讶地发现,在将方法传递给另一个方法时,方法上的 return 类型会产生重载歧义。由于 return 类型不是签名的一部分,因此很难看出更改 return 值会如何在以前不存在的地方产生歧义。然而,void 和 Task 似乎就是这种情况。考虑以下因素:
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
}
有没有一种方法可以定义 Overload 参数类型,以便第二次调用不会产生歧义,同时仍允许第一次调用?
不,无法修复重载分辨率。
但是,您可以以稍微丑陋的调用站点代码为代价消除歧义:
Signature.Overload( () => this.Decrement() );
在这种情况下,编译器将正确推断重载。
我惊讶地发现,在将方法传递给另一个方法时,方法上的 return 类型会产生重载歧义。由于 return 类型不是签名的一部分,因此很难看出更改 return 值会如何在以前不存在的地方产生歧义。然而,void 和 Task 似乎就是这种情况。考虑以下因素:
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
}
有没有一种方法可以定义 Overload 参数类型,以便第二次调用不会产生歧义,同时仍允许第一次调用?
不,无法修复重载分辨率。
但是,您可以以稍微丑陋的调用站点代码为代价消除歧义:
Signature.Overload( () => this.Decrement() );
在这种情况下,编译器将正确推断重载。