【问题标题】:Convert error between Expression and Delegate在 Expression 和 Delegate 之间转换错误
【发布时间】:2016-05-05 10:31:27
【问题描述】:

我们可以编写如下代码:

 Func<string, string> func = x => x + x;

我们也可以这样写:

 Expression<Func<string, string>> exp = x => x + x;

但是当我写的时候:

Expression<Func<string, string>> exp = func;

编译器抛出错误:

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

所以我将代码更改如下:

  Expression<Func<string, string>> exp = (Expression<Func<string, string>>)func;

和以前一样的错误。

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

【问题讨论】:

    标签: c# lambda delegates expression expression-trees


    【解决方案1】:

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

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

    您可以在执行时从表达式树转换为委托(使用LambdaExpression.Compile),但不能另辟蹊径。

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

    【讨论】:

    • 我不确定这是否真的回答了这个问题。你说在编译时,但是 func 的类型在编译时是已知的。
    • @LewsTherin:是的。但这不是 lambda 表达式本身的类型——它没有类型。 (就像null 文字没有类型、匿名方法和方法组一样。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多