WSDL and all of that is way outside of my experience (and doesn't seem to be something you are really having questions about, just complaints), so I won't speak to that. Doing a search for "generic delegate inference" showed other people that were having the same problem as you, along with some explanations I will rephrase here. I'm sure I've run into the problem before and just don't remember where. The problem seems to come down to the compiler having to infer too many things at once. The rest of this post is how I assume the general flow of compilation goes, but I am by no means an authority on the compiler. When you say Invoke(globalService.logout), the compiler first has to guess what type to make globalService.logout, before it can determine what types to use for Invoke. It will then look to the method signature of Invoke to try to determine what type of delegate to create from the method group globalService.logout. It will see that it is based on a generic parameter, so it can't make any assumptions there. In this case, there is only one possible overload of logout, but there could be more logout definitions, and then there would be no way to know which one you want. The compiler team probably decided it wasn't worth adding the special case for when you have only one overload. One reason against that feature would be that adding an overload to the method would suddenly break previously working code. Since there are no other parameters, the compiler has no more information to help it determine what types to fill in for the generic declaration and gives up. If you were to change Invoke to be Invoke<TRequest, TRepsone>(Func<TRequest, TResponse> method, TRequest param), the compiler would then figure it out from the second parameter. It can determine this because you are not allowed to overload methods solely by return type. Thus when it sees the second parameter is, for example, string, the first parameter becomes Func<string, TResponse> which is apparently just enough for it to do the rest of the work itself. As you might guess, giving Invoke a parameter of TResponse will not clear up the error (because you could still have multiple definitions that would match).