In principle, the answer from Vlad is correct and you don't need to declare the lambda function as a delegate in advance.
Except, the situation is not as simple in C#, because the compiler cannot decide whether the syntactical lambda expression should be compiled as a delegate (e.g. Func<int>
) or an expression tree (e.g. Expression<Func<int>>
) and also, it can be any other compatible delegate type. So, you need to create the delegate:
int foo = new Func<int>(() => {
Console.WriteLine("bar"); return 1; })();
You can simplify the code slightly by defining a method that simply returns the delegate and then calling the method - the C# compiler will infer the delegate type automatically:
static Func<R> Scope<R>(Func<R> f) { return f; }
// Compiler automatically compiles lambda function
// as delegate and infers the type arguments of 'Scope'
int foo = Scope(() => { Console.WriteLine("bar"); return 1; })();
I agree that this is an ugly trick that shouldn't be used :-), but it is an interesting fact that it can be done!