У меня создалось впечатление, что назначение не возможно внутри лямбда-выражения. Например, следующий (по общему признанию, не очень полезный) код
Expression<Action<int, int>> expr = (x, y) => y = x;
Производит ошибку компилятора
An expression tree may not contain an assignment operator
И все же, согласно документации Microsoft, можно программно создать выражение присваивания с помощью 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();
В этом случае компилятор не жалуется. Я чувствую, что здесь отсутствует какое-то важное различие.