我遇到了这个 C# 编译器错误,虽然我同意编译器无法推断 lambda 的类型,但错误消息似乎是错误的。这是相关的代码:
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>
,由于通用委托(delegate)协方差,情况似乎并非如此,这意味着这可以正常工作:
Func<object> lambda = new Func<Task<int>>(async () => { return await Task.FromResult(1); });
最佳答案
The lambda is indeed returning
Task<int>
, but why does the compiler think that it should try to convert it toSystem.Func<object>
?
我认为该错误消息措辞不当。它尝试派生 lambda 的返回类型(可以是 void
、 Task
或 Task<T>
),并将 lambda 转换为 Func<object>
。 。我建议您在 Microsoft Connect 上提出问题,请求更清晰的错误消息。
On the other hand, if what the error message is trying to convey is that
System.Func<Task<int>>
cannot be assigned toSystem.Func<object>
, that doesn't seem to be the case thanks to generic delegate covariance
确实如此,但编译器直到比大多数表达式“晚”时才确定 lambda 表达式的类型。编译器看不到Func<Task<int>>
(它只是看到一个不带参数的 lambda 表达式并返回 Task
或 Task<int>
),因此它不会使用通用委托(delegate)方差。
我希望 Eric Lippert 能够发表一篇关于如何 async
的博客文章lambda 表达式得到解析,特别是在方法重载选择的情况下。
关于c# - 关于异步 lambda 类型推断的错误 C# 编译器错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13260167/