转换Expression和Delegate之间的错误

roa*_*oul 3 c# lambda delegates expression expression-trees

我们可以写下面的代码:

 Func<string, string> func = x => x + x;
Run Code Online (Sandbox Code Playgroud)

我们也可以写:

 Expression<Func<string, string>> exp = x => x + x;
Run Code Online (Sandbox Code Playgroud)

但是当我写道:

Expression<Func<string, string>> exp = func;
Run Code Online (Sandbox Code Playgroud)

编译器抛出一个错误:

无法将类型'System.Func'隐式转换为'System.Linq.Expressions.Expression>'

所以我改变代码如下:

  Expression<Func<string, string>> exp = (Expression<Func<string, string>>)func;
Run Code Online (Sandbox Code Playgroud)

和以前一样的错误.

那么什么是真正的类型x => x + x;,Expression和Delegate/Lambda Expression之间的关系是什么?

Jon*_*eet 6

那么什么是真正的类型 x => x + x;

它没有.lambda表达式可以隐式转换为兼容的委托类型和表达式树类型(有一些限制)但是该决定是在编译时进行的,并且根据转换的目标生成不同的代码.

您可以在执行时(使用LambdaExpression.Compile)从表达式树转换为委托,但不能采用其他方式.

基本上,lambda表达式是某些逻辑的源表示.编译器可以生成该逻辑的代码表示(转换为委托)或该逻辑的数据表示(转换为表达式树).非常具体,对于表达式树,生成将构建数据表示的代码.