Первый пример: нулевой аргумент
В первом случае это вызовет перегрузку string
. null
соответствует обоим object
и string
, но строка является более конкретным / производным типом. Таким образом он выбирает string
.
Проверьте сообщение Эрика Липперта Как система разрешения перегрузки методом решает, какой метод вызывать при передаче нулевого значения? для более подробного объяснения этой части разрешения перегрузки.
Теперь мы должны определить лучшего из подходящих кандидатов. Правила совершенства сложны, но короткая версия состоит в том, что конкретнее лучше, чем менее конкретно.
Второй пример: целочисленный литерал
Во втором случае он выберет первую перегрузку, потому что литерал 7
равен int
. Если бы вы использовали 7u
, это было бы uint
, и поэтому вторая перегрузка была бы предпочтительнее.
Целочисленные литералы имеют четко определенный тип (даже если они допускают больше неявных преобразований, чем обычные интегральные значения). Вы можете использовать суффиксы, такие как u
для без знака или l
для длительного воздействия на этот тип. Или вы можете добавить явное приведение.
Хотя обычно int
не может быть неявно преобразовано в uint
, это целое число константа , которое находится в допустимом диапазоне uint
, и у компилятора C # есть дополнительное правило чтобы разрешить неявные преобразования между целыми числами констант , при условии, что константа соответствует диапазону цели.
Еще раз Эрик объясняет детали: Почему это неявное преобразование из int в uint работает?
Константное выражение типа int можно преобразовать в тип sbyte, byte, short, ushort, uint или ulong, если значение константы-выражения находится в пределах диапазона целевого типа. Постоянное выражение типа long можно преобразовать в тип ulong при условии, что значение константного выражения не является отрицательным.
В обоих примерах одна перегрузка явно лучшая с точки зрения компилятора C #, и, таким образом, вы не получите неоднозначную ошибку перегрузки.
Лично я считаю, что первый пример должен давать предупреждение, но либо команда C # не согласна, либо у них просто не было времени добавить эту эвристику.