First of all, this is a "return type based overload":
void M(int x){...} int M(int x){...} string M(int x){...}
Declarations are not legal; you cannot overload a method based on the type of the return type, because the return type is not part of the signature, and the signature must be unique.
What you are talking about is method type inference based on the type of the returned method. We also do not support this.
The reason is that the type of return may be what you are trying to figure out.
M(Test());
What is the type of test return? It depends on which overload M we choose. What overload M will we choose? It depends on the type of test returned.
In general, C # is designed in such a way that each subexpression has a type, and types are developed from "inside" to "outside", and not from outside to inside.
Notable exceptions are anonymous functions, method groups, and null:
M(x=>x+1)
What type is x => x + 1? It depends on which overload M is caused.
M(N);
what type of n? Again, it depends on which overload M is caused.
And so on. In these cases, we reason from "outside" to "inside."
The output type involving lambda is extremely complex and difficult to implement. We do not want to have the same complication and difficulties throughout the compiler.
Eric Lippert
source share