То, что печатается, полностью основано на том, какая перегрузка Console.WriteLine
выбрана.Какая перегрузка выбрана, основана на разделе 7.5.3.2 спецификации «betterness» для членов функции.
Перегрузка «лучше», чем у другого, когда она имеет параметр, который «более специфичен», чем другойодин.«более конкретный» означает, что существует неявное преобразование из более конкретного типа в менее конкретный тип, и нет неявное преобразование из менее определенного типа в более конкретный тип.
object
является наименее специфичной перегрузкой, поскольку не существует неявного преобразования из нее в тип int, double или string, но существует один тип для каждого типа.int более специфичен, чем double, потому что есть неявное преобразование из int в double, но нет преобразования из double в int.int и string не имеют неявных преобразований между собой, поэтому ни один из них не является более конкретным, и поэтому ни один из них не лучше и не хуже, чем другой.
Так что, если существует неявное преобразование вашего объекта в string
, тогда строкаПерегрузка считается, и есть связь для «лучшей» перегрузки, и вы получаете ошибку.Когда он отсутствует, существует «самый специфический» тип всех рассмотренных перегрузок (который int
), поэтому он «лучший», и эта перегрузка выбрана.