我正在使用表达式,我有以下表达式
//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表达式时,表达式“编译器”是否继续引用其堆栈中的所有变量而不是名称?
这意味着可以构建lambda表达式
(p,p)=>p % p == 5
哪个p不同?
这些信息如何在运行时存储?
答案 0 :(得分:2)
是的,使用相同类型和名称创建的两个参数是不同的。
更改行
var lambda = Expression.Lambda(e, Expression.Parameter(typeof(int), "p"));
到
var lambda = Expression.Lambda(e, p);