Seule l'expression lambda sans corps de méthode peut être converti en arbre d'expression
Après constructions compilons:
Func<int> exp1 =() => 1;
Func<int> exp2 =() => { return 1; };
Func<int> exp3 = delegate { return 1; };
Expression<Func<int>> exp4 =() => 1;
Et ci-dessous ne pas
Expression<Func<int>> exp5 = delegate { return 1; }; //no anonymous delegates
Expression<Func<int>> exp6 =() => { return 1; }; //or lambdas with block body
Donc, il est différence même sur un niveau pas très avancé (que Jon Sk eet souligne ici sick difference example)
Une autre différence est que vous pouvez créer des délégués anonymes sans liste de paramètres si vous ne prévoyez pas de les utiliser dans le corps de la méthode, avec lambda vous devez toujours fournir des paramètres.
deux lignes suivantes montrent la différence
Func<int, int, int, int, int> anonymous = delegate { return 1; };
Func<int, int, int, int, int> lambda = (param1, param2, param3, param4) => 1;
Vous faites essentiellement la même chose, mais délégué anonyme semble bien mieux ici.
+1, mais ne sont pas des expressions lambda réinventant simplement la roue (plutôt mal, car je pensais que les méthodes anonymes avaient plus de sens). –
donc l'expression de lambada ne peut PAS avoir de valeur de retour? alors que la méthode anonyme peut? –
SnOrfus: oui, ils font la même chose donc vous avez raison, c'est juste une question de préférence syntaxique.Sasha: les méthodes lambda et anonymes peuvent avoir des valeurs de retour. –