Nur Lambda-Ausdrücke ohne Methodenkörper können in einen Ausdrucksbaum umgewandelt werden
Folgende Konstrukte tun kompilieren:
Func<int> exp1 = () => 1;
Func<int> exp2 = () => { return 1; };
Func<int> exp3 = delegate { return 1; };
Expression<Func<int>> exp4 = () => 1;
Und folgendes tun pas
Expression<Func<int>> exp5 = delegate { return 1; }; //no anonymous delegates
Expression<Func<int>> exp6 = () => { return 1; }; //or lambdas with block body
Es gibt also auch auf nicht sehr fortgeschrittenem Niveau Unterschiede (worauf Jon Skeet hier hinweist Beispiel für kranken Unterschied )
Ein weiterer Unterschied ist, dass Sie anonyme Delegierte ohne Parameterliste erstellen können, wenn Sie nicht vorhaben, sie innerhalb des Methodenkörpers zu verwenden, während Sie bei Lambdas immer Parameter angeben müssen.
Die folgenden beiden Zeilen verdeutlichen den Unterschied
Func<int, int, int, int, int> anonymous = delegate { return 1; };
Func<int, int, int, int, int> lambda = (param1, param2, param3, param4) => 1;
Sie tun im Wesentlichen das Gleiche, aber der anonyme Delegierte sieht hier eindeutig besser aus.