为什么当我将 AssignmentExpression 放入 LambdaExpression 中时,它会自动成为返回语

本文关键字:返回语 中时 AssignmentExpression LambdaExpression 放入 为什么 | 更新日期: 2023-09-27 18:35:46

我正在 LambdaExpression 中做一个赋值。 出于某种原因,lambda 也将该赋值视为 lambda 的返回类型。

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();

为什么当我将 AssignmentExpression 放入 LambdaExpression 中时,它会自动成为返回语

来自 Expression.Block 方法的文档:

执行块表达式

时,它将返回块中最后一个表达式的值。

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

在第一个示例中,您正在调用 Block() 的重载,它接受 ParameterExpression 的集合。在第二个示例中,您将调用 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);
相关文章: