Question

You can assign a method to a delegate with matching type args:

Func<string, DateTime> f = DateTime.Parse;

You can assign a lambda to a delegate with covariant type args:

Func<string, object> f = s => DateTime.Parse(s);

But you can't assign a method to a delegate with covariant type args:

Func<string, object> f = DateTime.Parse; //ERROR: has the wrong return type

Why not?

Was it helpful?

Solution

Variance does not work with value types, since they need to be JITed differently.

Your lambda expression variant does not involve variance; instead, it compiles to a lambda expression with an implicit boxing conversion from DateTime to object.

If you use a method that returns a reference type, it work fine:

Func<string, object> f = string.Intern;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top