Solo espressione lambda senza metodo corpo può essere convertito in albero di espressione
seguenti costrutti DO di compilazione:
Func<int> exp1 =() => 1;
Func<int> exp2 =() => { return 1; };
Func<int> exp3 = delegate { return 1; };
Expression<Func<int>> exp4 =() => 1;
E seguendo lo fanno non
Expression<Func<int>> exp5 = delegate { return 1; }; //no anonymous delegates
Expression<Func<int>> exp6 =() => { return 1; }; //or lambdas with block body
Quindi non v'è differenza anche a livello non molto avanzato (quello di Jon Sk eet punta a questo punto sick difference example)
Un'altra differenza è che è possibile creare delegati anonimi senza elenco parametri se non si prevede di utilizzarli all'interno del metodo body, con lambda è sempre necessario fornire parametri.
due righe seguenti mostrano la differenza
Func<int, int, int, int, int> anonymous = delegate { return 1; };
Func<int, int, int, int, int> lambda = (param1, param2, param3, param4) => 1;
Fate essenzialmente la stessa cosa, ma delegato anonima chiaramente un aspetto migliore qui.
fonte
2011-08-05 01:08:46
+1, ma non sono espressioni lambda che reinventano la ruota (piuttosto male, come se i metodi anonimi avessero più senso). –
quindi l'espressione lambada NON può avere valore di ritorno? mentre il metodo anonimo può? –
SnOrfus: sì, fanno la stessa cosa, quindi hai ragione, è solo una questione di preferenza per la sintassi.Sasha: sia lambdas che metodi anonimi possono avere valori di ritorno. –