In .NET 4.0 you can do this because the Func delegate marks TResult with the out modifier. .NET 3.5 does not support generic covariance/contravariance so you can't simply cast. I'm not sure if there's another clever way of doing it that is faster than reflection.
Here's the .NET 4.0 doc page for Func. Notice that TResult is marked with "out" so its return value can be cast as a less-specific type such as object.
For a quick example that has no external dependencies, the following code fails to compile on .NET 3.5 but compiles and runs correctly on .NET 4.0.
// copy and paste into LINQpad
void Main()
{
Func func1 = GetString;
string res1 = func1(1);
res1.Dump();
Func func2 = func1;
object res2 = func2(1);
res2.Dump();
}
public string GetString(T obj) {
return obj.ToString();
}