2017-09-24 4 views
0

je le simple code suivant:.Erreur sur Expression.Lambda() Compile()

var b = Expression.Parameter(typeof(double), "b"); 
    var negativeB = Expression.Negate(b); 

Si j'arrête là et essayez de regarder rapidement Expression.Lambda(negativeB).Compile() je reçois une erreur:

variable 'b' of type 'System.Double' referenced from scope '', but it is not defined

Les autres réponses à propos de ce message d'erreur ne semblent pas aborder ce qui se passe ici, ni comment le réparer dans ce cas.

+0

Vous devez utiliser Lambda > pour le rendre fortement typé. Des choses comme DynamicInvoke sont des ordres de grandeur plus lents que des alternatives fortement typées. –

+0

@ AntonínLejsek, je ne sais pas quelle formule l'utilisateur tapera. Puis-je créer 'Lambda >' à l'exécution afin que je puisse utiliser 'Invoke()' au lieu de 'DynamicInvoke()'? – toddmo

+0

Si vous ne savez pas, alors il n'y a pas d'aide. De l'exemple, il me semblait que vous le savez. –

Répondre

3

Vous avez une expression negativeB qui nécessite un paramètre d'entrée de b. Cependant, lorsque vous définissez votre Lambda, vous ne définissez aucun paramètre.

Ce que vous devez faire est la suivante:

Expression.Lambda(negativeB, b).Compile(); 

Cette compile ensuite

3

Vous devez spécifier le paramètre (b) dans le Lambda:

var l = Expression.Lambda(negativeB, b).Compile(); 
var r = l.DynamicInvoke(32); // = -32