Lambda编译失败,引用定义在''作用域,但未定义
本文关键字:未定义 作用域 编译 失败 引用 定义 Lambda | 更新日期: 2023-09-27 17:55:05
在下面的简单代码片段中:
static void Main(string[] args)
{
Expression<Func<string, bool>> equal = s => s == "test";
LambdaExpression lambda = Expression.Lambda(equal.Body, Expression.Parameter(typeof(string), "s"));
lambda.Compile();
}
编译方法失败,InvalidOperationException
"类型为'System '的变量's'。字符串'从作用域引用',但它没有定义"。
虽然我发现了其他类似的问题,但我无法理解所提供的答案。
LambdaExpression的DebugView包含这个:
.Lambda #Lambda1<System.Func`2[System.String,System.Boolean]>(System.String $s) {
$s == "test"
}
所以我在这个问题的其他例子中看到,参数和用法不匹配,这并没有出现在这里是一个问题。我做错了什么?
lambda表达式的形参不使用基于名称的相等性,而是使用引用相等性。因此,在表达式中,您有两个完全不同的参数,称为s
,一个已定义但未使用,另一个已使用但未定义。
s1 => s2 == "test"
,这就是为什么它不能编译。最简单的修复方法是使用与原始表达式相同的形参:
LambdaExpression lambda = Expression.Lambda(equal.Body, equal.Parameters.Single());
如果你真的想使用你自己的参数,你需要用你的新参数替换lambda主体中原始参数的所有实例。可能最好的方法是使用ExpressionVisitor
。