Я работаю с выражениями и у меня есть следующее выражениеScoping в выражениях C#
//p=> 5 == p % 5
var p = Expression.Parameter(typeof(int), "p");
var e = Expression.MakeBinary(ExpressionType.Equal,
Expression.Constant(5),
Expression.Modulo(
p,
Expression.Constant(5)
));
var lambda = Expression.Lambda(e, Expression.Parameter(typeof(int), "p"));
var func = lambda.Compile();
Я получаю текущее исключение:
An unexpected exception type was thrown
Expected: System.NotImplementedException
but was: System.InvalidOperationException : variable 'p' of type 'System.Int32' referenced from scope '', but it is not defined
Теперь это имеет смысл, но то, что я нахожу в заблуждение заключается в том, что при компиляции выражения Lambda компилятор Expression сохраняет ссылку на все переменные в стеке, а не на имена?
Это означает, что может быть возможным построить лямбда-выражение
(p,p)=>p % p == 5
где каждый р отличается? Как эта информация хранится во время выполнения?
Да, вы бинарное выражение сохранить ссылку на 'p' переменных и ожидает, что он будет доступен при создании лямбды. Передача другого параметра с тем же именем не будет работать. – MarcinJuraszek