variable '' de type '' référencée à partir de scope '', mais elle n'est pas définie

c# expression-trees

Question

Eh bien, le code suivant s’explique de lui-même; Je souhaite combiner deux expressions en une seule à l'aide de l'opérateur And . La dernière ligne provoque l'erreur:

Informations complémentaires: variable 'y' de type 'System.String' référencée depuis scope '', mais non définie

Code:

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

Réponse acceptée

Merci tout le monde a collaboré.

Comme l'a souligné dasblinkenlight , les deux paramètres des deux expressions ne sont pas identiques. Raison? Eh bien, c'est l'astuce du compilateur. Lors de la compilation, il crée une classe pour chaque expression et nomme chaque paramètre comme xxx1, xxx2, ... complètement différent des noms d'origine.

Et la réponse pour .Net 4.0+:

Comment combiner deux lambdas


Réponse populaire

Le problème est que les objets d'expression de paramètre qui représentent la variable y dans les expressions e1 et e2 sont différents. Le fait que les deux variables portent le même nom et aient le même type importe peu: e1.Parameters.First() et e2.Parameters.First() ne sont pas le même objet.

Cela cause le problème que vous voyez: seul le paramètre y e1 est disponible pour Lambda<> , alors que le paramètre e2 de y est en dehors de la portée.

Pour résoudre ce problème, utilisez les API d' Expression pour créer e1 et e2 . De cette façon, vous pourrez partager l'expression de paramètre entre eux, éliminant ainsi le problème de la portée.




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