为什么当我把它放在 LambdaExpression 中时,我的 AssignmentExpression 会自动变成 return 语句

Why does my AssignmentExpression automatically become a return statement when I put it in a LambdaExpression

我正在 LambdaExpression 中进行赋值。出于某种原因,lambda 将该赋值也视为 lambda 的 return 类型。

var localIntVar = Expression.Variable(typeof(int));
var assign = Expression.Assign(localIntVar, Expression.Constant(5));
var block = Expression.Block(new ParameterExpression[]{localIntVar}, assign);
var lambda = Expression.Lambda(block);

lambda.Dump();

生成的 lambda 类型为 Func<Int32>。我预计它会是 Action。如果我在块的末尾添加一个 Expression.Empty(),它会按预期工作。

var localIntVar = Expression.Variable(typeof(int));
var assign = Expression.Assign(localIntVar, Expression.Constant(5));
var block = Expression.Block(new ParameterExpression[]{localIntVar}, assign, Expression.Empty());
var lambda = Expression.Lambda(block);

lambda.Dump();

来自 Expression.Block method 的文档:

When the block expression is executed, it returns the value of the last expression in the block.

因此,不是赋值表达式被视为 return 值,而是任何作为 Expression.Block 方法的最后一个参数的表达式。

在第一个示例中,您将调用 this overload of Block() which accepts a collection of ParameterExpression. In the second example you are invoking a different overload 的 Block(),它指定了一个没有变量的块表达式。

试试这个:

var localIntVar = Expression.Variable(typeof(int));
var assign = Expression.Assign(localIntVar, Expression.Constant(5));
var block = Expression.Block(localIntVar, assign, Expression.Empty());
var lambda = Expression.Lambda(block);