Когда вы переопределяете метод, вы в основном помещаете новую реализацию в «слот» 1 , который уже был определен вашим базовым классом для этого метода.Когда вы скрываете метод (не используете переопределение), вы берете имя, которое использовал ваш базовый класс, и присваиваете это имя другому"слоту".
Когда компиляторвыполняет разрешение имени / перегрузки, в основном он пытается решить, через какой «слот» направить вызов метода (потому что из-за перегрузки у вас может быть несколько методов с одинаковыми именами, но у них будут разные «слоты»).
При компиляции Console.WriteLine
единственный слот, который компилятор может выбрать для ToString
, - это тот, который Object
объявил для его ToString
метод.Так что это единственный метод, который он когда-либо будет вызывать 2 .
1 Я использую здесь «слот», потому что пока вы не найдетеон использовался в C # Spec, насколько я помню, на уровне CLR методы затенения помечены newslot
.
2 Не уверен на 100%, что он вызывает буквально ToString
, а не проходить через любое количество косвенных указаний, но достаточно сказать, что это так.