在下面的代码片段中,
class Program
{
static async Task Work()
{
await Task.Delay(1000);
}
static async Task Main()
{
// Action a = Work;
Action b = async () => await Task.Delay(1000);
Action c = async delegate () { await Task.Delay(1000); };
}
}
代表类型 Action
不能分配给方法 Work
类型 Task
但奇怪的是可以分配给匿名方法或类型为 Task
的 lambda .
我的理解
-
Work
-
async () => await Task.Delay(1000)
-
async delegate () { await Task.Delay(1000); }
具有与Action
不兼容的相同签名.是什么导致了这种不一致?
编辑:
下面的lambda和匿名方法
-
async () => await Task.Delay(1000)
-
async delegate () { await Task.Delay(1000); }
可以同时代表Action
或 Func<Task>
取决于分配的左侧。更准确地说,
转换为 Action
含蓄地,
-
Action a = async () => await Task.Delay(1000)
-
Action b = async delegate () { await Task.Delay(1000); }
转换为 Func<Task>
含蓄地,
-
Func<Task> a = async () => await Task.Delay(1000)
-
Func<Task> b = async delegate () { await Task.Delay(1000); }
下面@JSteward 的评论是关于吗?
最佳答案
首先,Action
是一个返回类型void
的委托(delegate):
public delegate void Action()
并且您的方法具有返回类型 Task
。
其次,由 lambda 表达式创建的匿名方法的返回类型由委托(delegate)(Action
)的类型决定。由于委托(delegate)是 void
,您正在创建一个 void
匿名方法。 Task.Delay
调用的返回值被丢弃。
此外,delegate()
表达式中的匿名函数不是您假设的Task
类型。它是 void
类型,因为它没有 return
语句。如果你添加一个它甚至不会编译,因为你试图将它分配给 void
类型的委托(delegate):
Action c = async delegate () { return await Task.Delay(1000); };
给出错误信息
Anonymous function converted to a void returning delegate cannot return a value.
关于c# - 可以将委托(delegate)分配给匿名方法或 lambda,但不能分配给方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47462133/