Tak Dokładnie, jedynym rozróżnieniem jest fakt, że zwraca wartość.
Uproszczenie (bez użycia wyrażeń):
List<T>.ForEach
Podejmuje akcję, nie oczekuje zwrotu.
Tak więc Action<T>
wystarczyłby delegat ... powiedz:
List<T>.ForEach(param => Console.WriteLine(param));
to to samo co powiedzenie:
List<T>.ForEach(delegate(T param) { Console.WriteLine(param); });
Różnica polega na tym, że typ parametru i decelacja delegata są wywnioskowane na podstawie użycia, a nawiasy klamrowe nie są wymagane w prostej metodzie inline.
Natomiast
List<T>.Where
Pełni funkcję, oczekując wyniku.
Więc Function<T, bool>
można by się spodziewać:
List<T>.Where(param => param.Value == SomeExpectedComparison);
który jest taki sam jak:
List<T>.Where(delegate(T param) { return param.Value == SomeExpectedComparison; });
Możesz również zadeklarować te metody bezpośrednio i przypisać je do zmiennych IE:
Action myAction = () => Console.WriteLine("I'm doing something Nifty!");
myAction();
lub
Function<object, string> myFunction = theObject => theObject.ToString();
string myString = myFunction(someObject);
Mam nadzieję, że to pomoże.