当前位置: 首页 > 编程语言 > C#

变量”类型”从范围”引用,但它没有定义分享

时间:2023-04-10 21:35:13 C#

C#学习教程:从作用域引用变量“type”,但未定义我想使用And运算符将两个表达式合并为一个。最后一行导致运行时错误:附加信息:“System.String”类型的变量“y”从范围“引用”,但未定义代码:Expressione1=y=>y.L??ength<100;Expressione2=y=>y.L??ength<200;vare3=Expression.And(e1.Body,e2.Body);vare4=Expression.Lambda(e3,e1.Parameters.ToArray());e4.不重要:e1.Parameters.First()和e2.Parameters.First()不是同一个对象。这会导致您看到的问题:只有e1的参数y可用于Lambda,而e2的参数y超出范围。要解决此问题,请使用ExpressionAPI创建e1和e2。这样您就可以在它们之间共享参数表达式,从而消除范围问题。正如另一个答案所暗示的那样,您有两个表达式,它们都有一个名为y的参数。这些不会自动相互关联。要正确编译表达式,需要指定两个源表达式的参数:Expression>e1=(y=>y.L??ength>0);表达式>e2=(y=>y.L??ength>(e3,new[]{e1.Parameters[0],e2.Parameters[0]});FunccompiledExpression=e4.Compile();boolresult=compiledExpression("Foo","Foo");当然,你需要一个只有一个参数的组合两个表达式的表达式。您可以像这样重构表达式:ParameterExpressionparam=Expression.Parameter(typeof(string),"y");varlengthPropertyExpression=Expression.Property(param,"长度");vare1=Expression.GreaterThan(lengthPropertyExpression,Expression.Constant(0));vare2=Expression.LessThan(lengthPropertyExpression,Expression.Constant(5));vare3=Expression.AndAlso(e1,e2);vare4=Expression.Lambda>(e3,new[]{param});FunccompiledExpression=e4.Compile();boolresult=compiledExpression("Foo");至于你的评论,你不想重建表达式,而是对现有表达式的主体和参数进行重建:这有效UseExpressionRewritertocombinetwolambdaexpressionsinc#andAlsotoreplaceparameternamesinexpressionBody:Expression>e1=(y=>y.L??ength>0);Expression>e2=(z=>z.Length(e1,e2);FunccompiledExpression=e3.Compile();boolresult=compiledExpression("Foo");感谢您的合作。正如dasblinkenlight所指出的,两个参数在这两个表达式不一样。原因?嗯,这是一个编译技巧。编译时,它为每个表达式创建一个类,并将每个参数命名为xxx1,xxx2,...与原来完全不同。以及.Net4.0+的答案:Howtocombiningtwolambdas以上是C#学习教程:变量“type”是从作用域引用的,但是没有定义分享的全部内容,如果对大家有用的话以及需要了解更多C#学习教程的,希望大家多多关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: