无法将 lambda 表达式转换为类型“..“,因为它不是委托类型

本文关键字:类型 因为 表达式 lambda 转换 | 更新日期: 2023-09-27 18:30:33

美好的一天!我正在尝试使用 lambda 表达式编写一个匿名方法,该方法将从异步任务返回一个对象。我想在构造函数中执行此操作,因此这就是我无法使其父方法异步的原因。

ReadJsonAsync 方法返回一个Session对象。我将向您展示相关代码:

Session session;
fileService = new FileService();
session = async () =>  { return await fileService.ReadJsonAsync() };

提前感谢!

无法将 lambda 表达式转换为类型“..“,因为它不是委托类型

如果你想要一个匿名方法,你必须声明一个返回一个Task<Session>的方法,因为它标有async修饰符,因此必须返回一个void(仅适用于异步事件处理程序),TaskTask<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() 来等待内联函数和超时任务,则很有用。

相关文章: