无法将 lambda 表达式转换为类型“..“,因为它不是委托类型
本文关键字:类型 因为 表达式 lambda 转换 | 更新日期: 2023-09-27 18:30:33
美好的一天!我正在尝试使用 lambda 表达式编写一个匿名方法,该方法将从异步任务返回一个对象。我想在构造函数中执行此操作,因此这就是我无法使其父方法异步的原因。
ReadJsonAsync 方法返回一个Session
对象。我将向您展示相关代码:
Session session;
fileService = new FileService();
session = async () => { return await fileService.ReadJsonAsync() };
提前感谢!
如果你想要一个匿名方法,你必须声明一个返回一个Task<Session>
的方法,因为它标有async
修饰符,因此必须返回一个void
(仅适用于异步事件处理程序),Task
或Task<T>
:
Func<Task<Session>> anonFunction = async () => await fileService.ReadJsonAsync();
如果您所做的只是运行ReadJsonAsync
,您还可以像这样保存状态机生成:
Func<Task<Session>> anonFunction = fileService.ReadJsonAsync;
然后,您可以在调用堆栈的更高位置await
它:
Func<Task<Session>> anonFunction = fileService.ReadJsonAsync;
await anonFunction();
为了补充Yuval的有用答案,如果你只想等待一个内联函数,那么魔术语法是:
await ((Func<Task>)(async () =>
{
//async function code
}
))();
请注意末尾的额外括号,以便在声明后立即调用 lambda。显然,如果您的函数返回一个类型,那么它将Func<Task<Whatever>>
例如,如果您使用 Task.WhenAny()
来等待内联函数和超时任务,则很有用。