【问题标题】:Why can not be Func casted to Expression, but lambda can [duplicate]为什么不能将 Func 强制转换为 Expression,但 lambda 可以 [重复]
【发布时间】:2019-07-10 15:55:05
【问题描述】:

在下面的示例中,相同的 lambda 可以作为 Expression 保存在 test 中,但当它来自 Func 时无法编译:

Func<int> func = () => 2;
Expression test1 = (Expression<Func<int>>)(() => 2);
Expression test2 = (Expression<Func<int>>)(func); //does not compile

为什么 lambda 可以直接转换为 Expression,但表示为 Func 时不能?

【问题讨论】:

  • 这是一个编译器技巧。编译器解析 lambda 并将其转换为表达式。它不能通过委托来做到这一点。
  • @LasseVågsætherKarlsen 到目前为止,我最喜欢你的评论,我认为它以简单的方式解决了问题。

标签: c# lambda expression func


【解决方案1】:

Func&lt;int&gt; 是一个委托实例——一个对象的实例;除了“此目标对象引用,此方法句柄”之外,它不再具有任何语义状态。

表达式树更丰富的东西;它是代码的intent 的复杂图 - 本质上是一个 AST。您可以将表达式编译为委托实例,但不能将委托反转为表达式树。

当你这样做时:

Expression<Func<int>> func = () => 2;

你正在创建一个复杂的树;本质上:

var func = Expression.Lambda<Func<int>>(Expression.Constant(2, typeof(int)),
    Array.Empty<ParameterExpression>());

(但在一般情况下显然要复杂得多)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多