异步lambda到Expression <Func <Task >>

For*_*VeR 8 c# lambda async-await

众所周知,我可以将普通的lambda表达式转换为Expression<T>:

Func<int> foo1 = () => 0; // delegate compiles fine
Expression<Func<int>> foo2 = () => 0; // expression compiles fine
Run Code Online (Sandbox Code Playgroud)

我怎么能用异步lambda做同样的事情?我尝试过以下类比:

Func<Task<int>> bar1 = async () => 0; // also compiles (async lambda example)
Expression<Func<Task<int>>> bar2 = async () => 0; // CS1989: Async lambda expressions cannot be converted to expression trees
Run Code Online (Sandbox Code Playgroud)

有可能的解决方法吗?

Aka*_*ava 8

只有当代码可以由表达式树表示时,C#才能将lambda表达式转换为表达式树,如果您注意到,在System.Linq.Expressions中的表达式中没有等效的"async"关键字

因此,不仅异步,而且C#中提供的表达式中没有等效表达式的任何内容,C#都无法将其转换为表达式树.

其他例子是

  1. 不安全
  2. 运用


i3a*_*non 6

该错误是不言自明的:

“异步 lambda 表达式无法转换为表达式树”

它也记录在Async/Await FAQ 中

并且有充分的理由,async-await是框架之上的编译器功能。表达式用于将代码转换为其他命令(如 SQL)。这些其他语言可能没有async-await等价物,因此通过表达式启用它似乎不值得。

所以不,我看不到解决方法。

  • 嗯,这是一个有趣的链接。不知道我怎么会错过那个常见问题解答。 (2认同)