2015-03-27 4 views
0

Я работаю с выражениями и у меня есть следующее выражение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 где каждый р отличается? Как эта информация хранится во время выполнения?

+0

Да, вы бинарное выражение сохранить ссылку на 'p' переменных и ожидает, что он будет доступен при создании лямбды. Передача другого параметра с тем же именем не будет работать. – MarcinJuraszek

ответ

2

Да, два параметра, созданных с одинаковым типом и именем, различны.

Изменения линия

var lambda = Expression.Lambda(e, Expression.Parameter(typeof(int), "p")); 

в

var lambda = Expression.Lambda(e, p); 
+0

Итак, имена могут быть чем-то вроде «p1» и «p2», очевидно. Net выберет что-то более уникальное? – dbarnes

+0

@ dbarnes .Net не будет переименовывать параметры; попробуйте и выясните, что произойдет. В дереве выражений параметры выделяются ссылкой. В скомпилированном байтовом коде имена параметров не имеют смысла. – Cirdec

+0

Я вижу, что они представляют собой разные ссылки в дереве выражений (еще не смотрели на IL), но когда он компилируется, он выполняет поиск в справочной таблице, чтобы выяснить, какой именно из них использовать (это сделало бы самый смысл для меня) и даже смягчить идею всего имени в целом? – dbarnes

Смежные вопросы