Как я указал на странице ответов :
Derived.Foo (объект) печатается - при выборе перегрузки, если есть какие-либо совместимые
методы, объявленные в производном классе, все сигнатуры, объявленные в базовом классе, игнорируются
- даже если они переопределены в том же производном классе!
Другими словами, компилятор просматривает методы, которые были недавно объявлены в наиболее производном классе (на основе типа выражения во время компиляции), и определяет, применимы ли они. Если они есть, он использует «лучший» из доступных. Если ни один из них не применим, он пытается использовать базовый класс и так далее. Переопределенный метод не считается объявленным в производном классе.
Подробнее см. В разделах 7.4.3 и 7.5.5.1 спецификации C # 3.
Теперь точно, почему именно так указано - я не знаю. Для меня имеет смысл, что методы, объявленные в производном классе, имеют приоритет над методами, объявленными в базовом классе, иначе вы столкнетесь с проблемой «хрупкого базового класса» - добавление метода в базовый класс может изменить смысл кода с помощью производный класс. Однако, если производный класс переопределяет метод, объявленный в базовом классе, он четко осознает это, поэтому элемент хрупкости не применяется.