Oui Exactement, la seule distinction est le fait qu'il renvoie une valeur.
Simplification (sans utiliser d'expressions):
List<T>.ForEach
Prend une action, il ne s'attend pas à un résultat de retour.
Donc, un Action<T>
délégué suffirait .. dire:
List<T>.ForEach(param => Console.WriteLine(param));
revient à dire:
List<T>.ForEach(delegate(T param) { Console.WriteLine(param); });
la différence est que le type de param et la decleration de délégué sont inférés par l'utilisation et les accolades ne sont pas requises sur une méthode en ligne simple.
Tandis que
List<T>.Where
Prend une fonction, attend un résultat.
On Function<T, bool>
attendrait donc un :
List<T>.Where(param => param.Value == SomeExpectedComparison);
ce qui équivaut à:
List<T>.Where(delegate(T param) { return param.Value == SomeExpectedComparison; });
Vous pouvez également déclarer ces méthodes en ligne et les affecter aux variables IE:
Action myAction = () => Console.WriteLine("I'm doing something Nifty!");
myAction();
ou
Function<object, string> myFunction = theObject => theObject.ToString();
string myString = myFunction(someObject);
J'espère que ça aide.