Échec de la compilation Lambda, la référence est définie dans la portée, mais n'est pas définie.

c# expression-trees

Question

Dans l'extrait simple ci-dessous:

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

La méthode de compilation échoue avec une InvalidOperationException

"variable 's' de type 'System.String' référencée depuis scope '', mais elle n'est pas définie".

Bien que j'ai trouvé d'autres questions similaires, je n'ai pas compris les réponses fournies.

La DebugView de la LambdaExpression contient ceci:

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

Donc, là où j'ai vu dans d'autres exemples de cette question, le paramètre et l'utilisation ne correspondent pas, cela ne semble pas être un problème ici. Qu'est-ce que je fais mal?

Réponse acceptée

Les paramètres des expressions lambda n'utilisent pas l'égalité basée sur les noms, ils utilisent l'égalité de référence. Donc, dans votre expression, vous avez deux paramètres totalement différents appelés s , l'un est défini mais non utilisé, l'autre est utilisé mais non défini.

Donc, fondamentalement, votre expression est quelque chose comme s1 => s2 == "test" , raison pour laquelle il ne parvient pas à compiler. Le correctif le plus simple consisterait à utiliser le même paramètre que celui utilisé par l'expression originale:

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

Si vous voulez vraiment utiliser votre propre paramètre, vous devez remplacer toutes les occurrences du paramètre d'origine dans le corps lambda par votre nouveau paramètre. La meilleure façon de faire est probablement d’utiliser ExpressionVisitor .




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi