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

15

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

ReadJsonAsync方法返回一个Session对象。 以下是相关代码:

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

提前致谢!


Session 是一个委托类型吗?你想做什么? - Yuval Itzchakov
我想要一个匿名方法,它可以返回一个“Session”对象。抱歉我不是很擅长这个,但我正在努力学习和进步。 - masm64
1
没问题,但是你把结果存储在一个“Session”对象中,这没有意义。你试图将返回“Session”的方法存储到“Session”中。你应该将它存储到委托中(这是存储方法的方式)。 - Raymond Chen
1
这与您的问题无关,但是 return await fileService.ReadJsonAsync() 是多余的;您可以直接返回 fileService.ReadJsonAsync() 并删除 async 修饰符。 - Thomas Levesque
这个回答解决了你的问题吗?无法将Lambda表达式转换为“System.Delegate”类型 - StayOnTarget
2个回答

15

如果你想要一个匿名方法,你需要声明一个返回 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();

9
补充Yuval的有用回答,如果你只想等待一个内联函数,则神奇的语法如下:
```js await (async () => { // inline function logic here })(); ```
await ((Func<Task>)(async () =>
{
    //async function code
}
))();

注意在声明后立即调用lambda时结尾处有额外的括号。如果你的函数返回一个类型,那么它将是Func<Task<Whatever>> 当你使用Task.WhenAny()时非常有用,例如等待内联函数和超时任务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接