表达式 c# 中的作用域

Scoping in Expressions 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 表达式被编译时,表达式 "compiler" 是否保留对堆栈中所有变量的引用而不是名称?

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

(p,p)=>p % p == 5 每个 p 在哪里不同? 这些信息在运行时如何存储?

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

换行

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

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