Amit
Amit

Reputation: 667

What exactly is the type of lambda expression with a body?

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?

Upvotes: 5

Views: 159

Answers (2)

Sriram Sakthivel
Sriram Sakthivel

Reputation: 73472

Delegate is an abstract base class for all the delegates(MulticastDelegate comes in between). Lambda can't be converted to Delegate type as it can't be instantiated, and it doesn't have any signature.

So, You need to be more specific in saying what delegate type you're interested.

what is its type?

It has no type, it can be converted to any delegate type or Expression<TDelegate> type if the signature is compatible.

Upvotes: 0

Jon Skeet
Jon Skeet

Reputation: 1500675

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.

Upvotes: 8

Related Questions