There are several ways to express lambda, depending on the exact scenario - some examples:
// 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;
The lambda signature must match the signature of the delegate used (regardless of whether it is explicit, as indicated above, or implied by context in things like .Select(cust => cust.Name)
You can use lambdas with no arguments, using an empty list of expressions:
// no arguments Func<int> f0 = () => 12;
Ideally, the expression on the right is accurate; one expression. The compiler can convert this to a delegate or Expression tree:
// expression tree Expression<Func<int, int, int>> f6 = (x, y) => x * y;
However; you can also use statement blocks, but then they can only be used as delegate :
// braces for a statement body Func<int, int, int> f7 = (x, y) => { int z = x * y; Console.WriteLine(z); return z; };
Note that even if the .NET 4.0 Expression trees support operator bodies, the C # 4.0 compiler does not execute for you, so you are still limited to simple Expression trees, unless you do it the "hard way"; see my article on InfoQ for more information.