我们可以写下面的代码:
Func<string, string> func = x => x + x;
我们也可以写:
Expression<Func<string, string>> exp = x => x + x;
但是当我写道:
Expression<Func<string, string>> exp = func;
编译器抛出错误:
无法隐式转换类型&#39; System.Func&#39;至 &#39;&System.Linq.Expressions.Expression GT;&#39;
所以我改变代码如下:
Expression<Func<string, string>> exp = (Expression<Func<string, string>>)func;
与以前相同的错误。
那么x => x + x;
的真实类型是什么,表达式与委托/ Lambda表达式之间的关系是什么?
答案 0 :(得分:7)
那么
的实际类型是什么x => x + x;
它没有。 lambda表达式可以隐式转换为兼容的委托类型和表达式树类型(有一些限制)但是该决定是在编译时进行的,并且根据转换的目标生成不同的代码
您可以在执行时从表达式树转换为委托(使用LambdaExpression.Compile
),但不能采用其他方式。
基本上,lambda表达式是某些逻辑的源表示。编译器可以生成该逻辑的代码表示(转换为委托)或该逻辑的数据表示(转换为表达式树)。非常具体,对于表达式树,会生成将构建数据表示的代码。