variable '' de tipo '' referenciada desde el alcance '', pero no está definida

c# expression-trees

Pregunta

Bueno, el siguiente código es autoexplicativo; Quiero combinar dos expresiones en una utilizando el operador And . La última línea causa el tiempo de ejecución del error:

Información adicional: variable 'y' de tipo 'System.String' referenciada desde el alcance '', pero no está definida

Código:

Expression<Func<string, bool>> e1 = y => y.Length < 100;
Expression<Func<string, bool>> e2 = y => y.Length < 200;

var e3 = Expression.And(e1.Body, e2.Body);

var e4 = Expression.Lambda<Func<string, bool>>(e3, e1.Parameters.ToArray());
e4.Compile(); // <--- causes run-time error

Respuesta aceptada

Gracias a todos colaboraron.

Como señala dasblinkenlight , los dos parámetros en las dos expresiones no son los mismos. ¿Razón? Bueno, es el truco del compilador. Al compilar, crea una clase para cada expresión y nombra cada parámetro algo así como xxx1, xxx2, ... completamente diferente de los nombres originales.

Y la respuesta para .Net 4.0+:

Cómo combinar dos lambdas


Respuesta popular

El problema es que los objetos de expresión de parámetros que representan la variable y en las expresiones e1 y e2 son diferentes. El hecho de que las dos variables tengan el mismo nombre y el mismo tipo no importa: e1.Parameters.First() y e2.Parameters.First() no es el mismo objeto.

Esto hace que el problema que se ve: sólo e1 's de parámetros y está disponible a Lambda<> , mientras que e2 ' s de parámetros y está fuera de alcance.

Para solucionar este problema, use las API de Expression para crear e1 y e2 . De esta forma, podría compartir la expresión de parámetros entre ellos, eliminando así el problema de alcance.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow