2011-02-25 3 views
9

Cette ligne de code qui tente d'attribuer une expression lambda à une variable typée LambaExpression,syntaxe d'expression lambda vs classe LambdaExpression

LambdaExpression expr = n => n; 

il échoue avec la compilation message d'erreur:

ne peut pas convertir lambda expression de type 'System.Linq.Expressions.LambdaExpression' parce qu'il est pas un délégué Type

Il doit donc s'agir d'un type de délégué. Conceptuellement, cela me semble étrange car je peux construire une instance LambdaExpression en utilisant une méthode d'usine comme ça.

usine Lambda from MSDN

LambdaExpression lambdaExpr = Expression.Lambda(
    Expression.Add(
     paramExpr, 
     Expression.Constant(1) 
    ), 
    new List<ParameterExpression>() { paramExpr } 
); 

et ce n'est pas un type de délégué.

On se demande pourquoi lambda à LambaExpression ne peut pas fonctionner?

Répondre

8

Eh bien, ce fait travail:

Expression<Func<int, int>> exp = n => n; 
LambdaExpression lambda = exp; 

Notez que Expression<TDelegate> dérive de LambdaExpression.

Je pense que la raison pour laquelle vous ne pouvez pas simplement utiliser LambdaExpression comme type est que le type de n (dans votre exemple) ne peut pas être déduit.

Tenir compte du fait que vous ne pouvez pas non faire, pour essentiellement la même raison:

// What is this? An Action? A ThreadStart? What? 
Delegate d =() => Console.WriteLine("Hi!"); 

Alors que vous pouvez faire ceci:

Action a =() => Console.WriteLine("Hi!"); 
Delegate d = a; 

Il est essentiellement la même chose.

2

Parce que LambdaExpression est un moyen de générer des expressions lambda à l'exécution, alors que n => n est convertie en une classe générée au moment de la compilation. En bref: ils sont deux choses différentes à faire la même chose, mais ne peuvent pas être utilisés ensemble.

2

Pour citer le MSDN Le type LambdaExpression représente une expression lambda sous la forme d'un arbre d'expression. Le type Expression, qui dérive de LambdaExpression et capture plus explicitement le type de l'expression lambda, peut également être utilisé pour représenter une expression lambda. Lors de l'exécution, un nœud d'arbre d'expression qui représente une expression lambda est toujours de type Expression.

La valeur de la propriété NodeType d'un LambdaExpression est Lambda.

Utilisez les méthodes de fabrique Lambda pour créer un objet LambdaExpression.

Questions connexes