I suppose it probably has something to do with the fact that, at least from the compiler's perspective, Test
is actually a 'method group' until the compiler has determined what it types of parameters it will have. This is true even if there is only one method in the group (only one Test
method in the current scope).
Observe:
var composed = Compose<object>(Test, () => Console.WriteLine(" world"));
yields the error:
The best overloaded method match for '
Compose<object>(System.Action<object>, System.Action)
' has some invalid argumentsArgument 1: cannot convert from 'method group' to '
System.Action<object>
'
But this is fine:
var composed = Compose<string>(Test, () => Console.WriteLine(" world"));
My guess is that the compiler see the both method group expression (Test
) and implicitly typed generic method invocation (Compose
) as 'unbound' in a sense. It can't fully determine which method to select from the method group from the type 'unbound' signature of the parameter to Compose
, and it can't determine which the type type parameter for Compose
from the signature. It needs one or the other to be 'bound' in order to compile the whole statement.