Windows forms extension method Invoke() doesn't accept a lambda expression, without us having to first typecast it to a delegate type like Action. This makes me wonder, if lambda expression (with a body) is not explicitly a delegate nor an expression, what is its type?

2 Answers
2

This makes me wonder, if lambda expression (with a body) is not explicitly a delegate nor an expression, what is its type?

It doesn't have a type in the normal sense of the word (i.e. a CLR type), just like null doesn't have a type. (Older versions of the C# specification had the concept of a "null type", but that was removed.)

Instead, it's an expression which is convertible to any compatible concrete delegate or expression tree type.

See section 7.1 of the C# 5 specification ("Expression Classification") for details - the relevant bullet points (out of the list of kinds of expression) are:

A null literal. An expression with this classification can be implicitly converted to a reference type or nullable type.

An anonymous function. An expression with this classification can be implicitly converted to a compatible delegate type or expression tree type.