Sì Esatto, l'unica distinzione è il fatto che restituisce un valore.
Semplificazione (non usando espressioni):
List<T>.ForEach
Intraprende un'azione, non prevede un risultato di ritorno.
Quindi un Action<T>
delegato basterebbe .. dire:
List<T>.ForEach(param => Console.WriteLine(param));
è come dire:
List<T>.ForEach(delegate(T param) { Console.WriteLine(param); });
la differenza è che il tipo di parametro e la declerazione del delegato sono dedotti dall'uso e le parentesi graffe non sono richieste su un metodo inline semplice.
Mentre
List<T>.Where
Accetta una funzione, in attesa di un risultato.
Quindi Function<T, bool>
ci si aspetterebbe:
List<T>.Where(param => param.Value == SomeExpectedComparison);
che è lo stesso di:
List<T>.Where(delegate(T param) { return param.Value == SomeExpectedComparison; });
Puoi anche dichiarare questi metodi in linea e assegnarli alle variabili IE:
Action myAction = () => Console.WriteLine("I'm doing something Nifty!");
myAction();
o
Function<object, string> myFunction = theObject => theObject.ToString();
string myString = myFunction(someObject);
Spero che aiuti.