Существует несколько способов выражения лямбд, в зависимости от точного сценария - несколько примеров:
// simplest form; no types, no brackets
Func<int, int> f1 = x => 2 * x;
// optional exlicit argument brackets
Func<int, int> f2 = (x) => 2 * x;
// optional type specification when used with brackets
Func<int, int> f3 = (int x) => 2 * x;
// multiple arguments require brackets (types optional)
Func<int, int, int> f4 = (x, y) => x * y;
// multiple argument with explicit types
Func<int, int, int> f5 = (int x, int y) => x * y;
Подпись лямбды должна соответствовать подписи используемого делегата (будь то явная, как указано выше, или подразумеваемая контекстом в таких вещах, как .Select(cust => cust.Name)
Вы можете использовать лямбды без аргументов, используя пустой список выражений:
// no arguments
Func<int> f0 = () => 12;
В идеале выражение с правой стороны - именно это; единое выражение. Компилятор может преобразовать это в или a delegate
или в Expression
дерево:
// expression tree
Expression<Func<int, int, int>> f6 = (x, y) => x * y;
Тем не менее, Вы также можете использовать блоки операторов, но тогда их можно использовать только как delegate
:
// braces for a statement body
Func<int, int, int> f7 = (x, y) => {
int z = x * y;
Console.WriteLine(z);
return z;
};
Обратите внимание, что хотя деревья .NET 4.0 Expression
поддерживают тела операторов, компилятор C # 4.0 не делает это за вас, поэтому вы по-прежнему ограничены простыми деревьями Expression
, если только вы сделать это "трудным путем"; см. мою статью о InfoQ для получения дополнительной информации.