Перегрузки устраняются путем выбора наиболее конкретной перегрузки. В этом случае method1<string>(string)
более конкретный, чем method1(object)
, так что выбрана перегрузка.
Подробнее ... section 7.4.2 of the C# specification.
Если вы хотите выбрать конкретную перегрузку, вы можете сделать это, явно задав параметры тем типам, которые вы хотите. Далее будем называть method1(object)
перегрузки вместо родового один:
method1((object)"xyz");
Есть случаи, когда компилятор не будет знать, какой перегружать, чтобы выбрать, например:
void method2(string x, object y);
void method2(object x, string y);
method2("xyz", "abc");
В этом случае компилятор не знает, какую перегрузку выбрать, потому что ни перегрузка явно лучше, чем другая (она не знает, какая строка неявно опущена к объекту). Поэтому он испустит ошибку компилятора.
Похоже на [этот вопрос] (http://stackoverflow.com/questions/9017363/ambiguous-method-overloading) – adelphus