我的印象是在 lambda 表达式中不可能进行赋值。例如,以下(诚然不是很有用)代码
Expression<Action<int, int>> expr = (x, y) => y = x;
产生编译器错误
An expression tree may not contain an assignment operator
然而,根据微软的文档,可以通过编程方式使用Expression.Assign
. 除非我弄错了,否则以下代码会产生等效的代码Expression
:
ParameterExpression xparam = Expression.Parameter(typeof(int), "x");
ParameterExpression yparam = Expression.Parameter(typeof(int), "y");
BinaryExpression body = Expression.Assign(yparam, xparam);
var expr = Expression.Lambda<Action<int, int>>(body, xparam, yparam);
var cexpr = expr.Compile();
在这种情况下,编译器不会抱怨。我觉得我在这里遗漏了一些重要的区别。