众所周知,我可以将普通的lambda表达式转换为Expression<T>
:
Func<int> foo1 = () => 0; // delegate compiles fine
Expression<Func<int>> foo2 = () => 0; // expression compiles fine
我怎么能用异步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
是否有可能的解决方法?
答案 0 :(得分:8)
只有当代码可以由表达式树表示时,C#才能将lambda表达式转换为表达式树,如果您注意到,System.Linq.Expressions
中的表达式中没有等效的“async”关键字因此,不仅异步,而且C#中提供的表达式中没有等效表达式的任何内容,C#都无法将其转换为表达式树。
其他例子是
答案 1 :(得分:3)
错误非常自我解释:
“异步lambda表达式无法转换为表达式树”
它也记录在Async/Await FAQ。
中有充分理由,async-await
是框架之上的编译器功能。表达式用于将代码转换为其他命令(如SQL)。这些其他语言可能没有async-await
等效语言,因此通过表达式启用它似乎不值得。
所以不,我看不到解决方法。