Fallo de compilación Lambda, referencia definida en el alcance '', pero no está definida

c# expression-trees

Pregunta

En el simple fragmento a continuación:

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();
}

El método de compilación falla con una InvalidOperationException

"variable 's' del tipo 'System.String' referenciada desde el alcance '', pero no está definida".

Si bien he encontrado otras preguntas similares, no he entendido las respuestas proporcionadas.

El DebugView de LambdaExpression contiene esto:

.Lambda #Lambda1<System.Func`2[System.String,System.Boolean]>(System.String $s) {
    $s == "test"
}

Entonces, donde he visto en otros ejemplos de esta pregunta, el parámetro y el uso no coinciden, esto no parece ser un problema aquí. ¿Qué estoy haciendo mal?

Respuesta aceptada

Los parámetros de las expresiones lambda no usan la igualdad basada en nombres, usan la igualdad de referencia. Entonces, en su expresión, tiene dos parámetros completamente diferentes llamados s , uno está definido pero no se usa, el otro se usa pero no está definido.

Entonces, básicamente, tu expresión es algo así como s1 => s2 == "test" , por lo que no se compila. La solución más simple sería usar el mismo parámetro que usa la expresión original:

LambdaExpression lambda = Expression.Lambda(equal.Body, equal.Parameters.Single());

Si realmente desea utilizar su propio parámetro, deberá reemplazar todas las instancias del parámetro original en el cuerpo lambda con su nuevo parámetro. Probablemente la mejor manera de hacerlo es usar ExpressionVisitor .



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