Разрешение перегрузки метода в C # не всегда ведет себя так, как вы могли бы ожидать, но ваш код работает в соответствии со спецификацией (я написал в блоге об этом некоторое время назад).
Короче говоря, компилятор начинает с поиска методов, которые
- имеют одинаковые имена (в вашем случае
Test
) - объявлены в типе (в вашем случае
B
) или один из его базовых типов - не объявляется с модификатором переопределения
Обратите внимание, что последний пункт.Это на самом деле логично, поскольку виртуальные методы разрешаются во время выполнения, а не во время компиляции.
Наконец, если у типа (в данном случае B
) есть метод, который является кандидатом (что означает, чтопараметры в вашем вызове могут быть неявно преобразованы в тип параметра метода-кандидата), этот метод будет использоваться.Ваш переопределенный метод даже не является частью процесса принятия решения.
Если вы хотите вызвать переопределенный метод, вам нужно сначала привести объект к его базовому типу.