异步lambda到Expression <func <task>&gt;

时间:2015-07-21 15:31:42

标签: c# lambda async-await

众所周知,我可以将普通的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

是否有可能的解决方法?

2 个答案:

答案 0 :(得分:8)

只有当代码可以由表达式树表示时,C#才能将lambda表达式转换为表达式树,如果您注意到,System.Linq.Expressions

中的表达式中没有等效的“async”关键字

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

其他例子是

  1. 不安全
  2. 使用

答案 1 :(得分:3)

错误非常自我解释:

  

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

它也记录在Async/Await FAQ

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

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