变量”类型”从范围”引用,但它没有定义
那么,以下代码是自我解释的; 我想使用And
运算符将两个表达式合并为一个。 最后一行导致符文时间错误:
附加信息:从范围”引用的’System.String’类型的变量’y’,但未定义
码:
Expression<Func> e1 = y => y.Length < 100; Expression<Func> e2 = y => y.Length < 200; var e3 = Expression.And(e1.Body, e2.Body); var e4 = Expression.Lambda<Func>(e3, e1.Parameters.ToArray()); e4.Compile(); // <--- causes run-time error
问题是表达式e1
和e2
中表示变量y
参数表达式对象是不同的。 这两个变量的名称相同且类型相同这一事实并不重要: e1.Parameters.First()
和e2.Parameters.First()
不是同一个对象。
这会导致您看到的问题:只有e1
的参数y
可用于Lambda<>
,而e2
的参数y
超出范围。
要解决此问题,请使用Expression
API创建e1
和e2
。 这样您就可以在它们之间共享参数表达式,从而消除了范围问题。
如另一个答案所示,您有两个表达式,其中两个都有一个名为y
的参数。 那些不会自动相互关联。
要正确编译表达式,您需要指定两个源表达式的参数:
Expression> e1 = (y => y.Length > 0); Expression> e2 = (y => y.Length < 5); var e3 = Expression.And(e1.Body, e2.Body); // (string, string) by adding both expressions' parameters. var e4 = Expression.Lambda>(e3, new[] { e1.Parameters[0], e2.Parameters[0] }); Func compiledExpression = e4.Compile(); bool result = compiledExpression("Foo", "Foo");
当然,您需要一个只用一个参数组合两个表达式的表达式。 您可以重建这样的表达式:
ParameterExpression param = Expression.Parameter(typeof(string), "y"); var lengthPropertyExpression = Expression.Property(param, "Length"); var e1 = Expression.GreaterThan(lengthPropertyExpression, Expression.Constant(0)); var e2 = Expression.LessThan(lengthPropertyExpression, Expression.Constant(5)); var e3 = Expression.AndAlso(e1, e2); var e4 = Expression.Lambda>(e3, new[] { param }); Func compiledExpression = e4.Compile(); bool result = compiledExpression("Foo");
至于您的注释,您不想重建表达式,而是对现有表达式的主体和参数执行此操作:这可以使用ExpressionRewriter
结合c#中的两个lambda表达式和AndAlso
来替换表达式Body中的参数名称 :
Expression> e1 = (y => y.Length > 0); Expression> e2 = (z => z.Length < 10); var e3 = ParameterReplacer.AndAlso(e1, e2); Func compiledExpression = e3.Compile(); bool result = compiledExpression("Foo");
谢谢大家的合作。
正如dasblinkenlight指出的那样,两个表达式中的两个参数是不一样的。 原因? 好吧,这是编译技巧。 编译时,它会为每个表达式创建一个类,并将每个参数命名为xxx1,xxx2,……与原始名称完全不同。
和.Net 4.0+的答案:
如何结合两个lambda
上述就是C#学习教程:变量”类型”从范围”引用,但它没有定义分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1026671.html