我碰到了这个C#编译器错误,虽然我确定编译器不能推断lambda的类型,但错误消息看起来不对。下面是相关的代码:异步lambda类型推断错误的C#编译器错误信息
Func<object> lambda = async() => { return await Task.FromResult(1); };
和这里的编译器错误:
error CS4010: Cannot convert async lambda expression to delegate type '
System.Func<object>
'. An async lambda expression may returnvoid
,Task
orTask<T>
, none of which are convertible to '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
*异步方法的返回类型必须为空,任务或任务 * –