在表达式中确定范围c#

时间:2015-03-27 19:40:19

标签: 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(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不同? 这些信息如何在运行时存储?

1 个答案:

答案 0 :(得分:2)

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

更改行

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

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