【发布时间】:2012-11-10 00:06:59
【问题描述】:
我遇到了这个 C# 编译器错误,虽然我对编译器无法推断 lambda 的类型感到满意,但错误消息似乎是错误的。这是相关的代码:
Func<object> lambda = async () => { return await Task.FromResult(1); };
这是编译器错误:
错误 CS4010:无法将异步 lambda 表达式转换为委托类型“
System.Func<object>”。异步 lambda 表达式可能返回void、Task或Task<T>,它们都不能转换为 'System.Func<object>'。
我不太明白的部分是最后一句话。 lambda 确实返回了Task<int>,但是为什么编译器认为它应该尝试将其转换为System.Func<object>?
另一方面,如果错误消息试图传达的是 System.Func<Task<int>> 不能分配给 System.Func<object>,由于通用委托协方差,这似乎不是这种情况,这意味着这只是好吧:
Func<object> lambda = new Func<Task<int>>(async () => { return await Task.FromResult(1); });
【问题讨论】:
-
编译器应该将其转换为
System.Func<object>,因为这是您声明变量的方式,并且它与异步委托不兼容。 -
async方法的返回类型必须是void,Task或者Task
标签: c# .net-4.5 async-await