C# 表达式c中的作用域#

C# 表达式c中的作用域#,c#,lambda,C#,Lambda,我正在处理表达式,我有以下表达式 //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(

我正在处理表达式,我有以下表达式

//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表达式被编译时,表达式“compiler”是否保留了堆栈中所有变量的引用,而不是名称

这意味着可以构建lambda表达式

//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();
(p,p)=>p%p==5
每个p在哪里是不同的?
运行时如何存储此信息?

是的,使用相同类型和名称创建的两个参数不同

换线

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


是的,二进制表达式保留对
p
变量的引用,并希望在创建lambda时该变量可用。使用相同的名称传递不同的参数将不起作用。因此名称可能类似于“p1”和“p2”。显然。Net会选择更独特的名称?@dbarnes.Net不会重命名参数;试试看,看看会发生什么。在表达式树中,参数通过引用进行区分。在编译后的字节码中,参数名称没有任何意义。我发现它们是表达式树中的不同引用(还没有查看IL),但当它编译后,它会在引用“表”中进行查找,以确定使用哪一个(这对我来说最有意义)甚至在总体上减轻整个名字的想法?