Well, the following code is self-explaining; I want to combine two expressions into one using And
operator. The last line causes rune-time the error:
Additional information: variable 'y' of type 'System.String' referenced from scope '', but it is not defined
Code:
Expression<Func<string, bool>> e1 = y => y.Length < 100;
Expression<Func<string, bool>> e2 = y => y.Length < 200;
var e3 = Expression.And(e1.Body, e2.Body);
var e4 = Expression.Lambda<Func<string, bool>>(e3, e1.Parameters.ToArray());
e4.Compile(); // <--- causes run-time error
Best Answer
The problem is that parameter expression objects that represents variable
y
in expressionse1
ande2
are different. The fact that the two variables are named the same and have the same type does not matter:e1.Parameters.First()
ande2.Parameters.First()
is not the same object.This causes the problem that you see: only
e1
's parametery
is available toLambda<>
, whilee2
's parametery
is out of scope.To fix this problem use
Expression
APIs to createe1
ande2
. This way you would be able to share the parameter expression across them, thus eliminating the problem of scope.