c# - 关于异步 lambda 类型推断的错误 C# 编译器错误消息

标签 c# .net-4.5 async-await

我遇到了这个 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 return void, Task or Task<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 to System.Func<object>?

我认为该错误消息措辞不当。它尝试派生 lambda 的返回类型(可以是 voidTaskTask<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 to System.Func<object>, that doesn't seem to be the case thanks to generic delegate covariance

确实如此,但编译器直到比大多数表达式“晚”时才确定 lambda 表达式的类型。编译器看不到Func<Task<int>> (它只是看到一个不带参数的 lambda 表达式并返回 TaskTask<int> ),因此它不会使用通用委托(delegate)方差。

我希望 Eric Lippert 能够发表一篇关于如何 async 的博客文章lambda 表达式得到解析,特别是在方法重载选择的情况下。

关于c# - 关于异步 lambda 类型推断的错误 C# 编译器错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13260167/

相关文章:

c# - WebClient.DownloadFileAsync 异常

c# - 从 DbDataReader 读取数据最快的方法是什么?

c# - 将用户输入的用户名/密码与 mysql 数据库用户名/密码进行比较不起作用

c# - 异步运行同步方法的正确方法是什么

javascript - 如何在 Node.js 中使用 async/await 编写依赖项

c# - 如何使用地板功能

.net-4.0 - 安装 .Net 4.5 Beta 会破坏从同一台计算机构建 .Net 4.0 吗?

c# - .Net Framework 4.5 中数组的 MaxSize

reactjs - 使用 redux thunk 的 action creator 和普通的 async function 之间的区别

c# - 使用 ChannelFactory 和 CreateChannel 进行异步 WCF 调用