Qual sobrecarga do método C # é escolhida?

Por que o método genérico é chamado quando as duas sobrecargas coincidem?

public static void method1(object obj) { Console.WriteLine("Object"); } public static void method1(T t) { Console.WriteLine("Type T"); } public static void Main(String args[]) { method1("xyz"); //Will print "Type T"; } 

Não deve haver nenhum conflito aqui, certo?

As sobrecargas são resolvidas escolhendo a sobrecarga mais específica. Nesse caso, method1(string) é mais específico que method1(object) modo que é a sobrecarga escolhida.

Há detalhes na seção 7.4.2 da especificação C # .

Se você quiser selecionar uma sobrecarga específica, poderá fazer isso explicitamente lançando os parâmetros para os tipos desejados. O seguinte chamará a sobrecarga method1(object) vez do genérico:

 method1((object)"xyz"); 

Existem casos em que o compilador não saberá qual sobrecarga selecionar, por exemplo:

 void method2(string x, object y); void method2(object x, string y); method2("xyz", "abc"); 

Nesse caso, o compilador não sabe qual sobrecarga escolher, porque nenhuma sobrecarga é claramente melhor que a outra (ela não sabe qual string é implicitamente reprovada no object). Por isso, irá emitir um erro do compilador.

C # sempre escolherá o método mais específico que puder.

Ao compilar

 method1("xyz"); 

ele procurará todos os methods com o nome especificado e tentará corresponder os parâmetros. O compilador irá escolher o método mais específico, neste caso ele preferiria

 method1(string s) 

sobre

 method1(T t) with T = string 

e por fim

 method1(object o) 

Por favor, observe a excelente resposta de @Erik para um exemplo onde o compilador não decide.

Porque você já está passando T como parâmetro, então você não precisa digitar method1("xyz"); você pode simplesmente ir method1("xyz"); .Net já sabe que é uma string. Se você tivesse method1, então seria uma história diferente.

Também desde que method1(object obj) não aceita uma string como parâmetro, ele favorecerá a function genérica primeiro, onde ela pode inferir T. Se você method1(object obj) mudar method1(object obj) para method1(string obj) ele favoreceria primeiro então o genérico.