Вывод: C.F, B.F, C.F. Метод не виртуальный, поэтому при сокрытии через new выбор зависит от статического типа выражения; объект при этом остаётся одним экземпляром C.
Как сокрытие метода F влияет на вызовы через базовый тип?
Вывод: C.F, B.F, C.F. Метод не виртуальный, поэтому при сокрытии через new выбор зависит от статического типа выражения; объект при этом остаётся одним экземпляром C.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите вывод C#:
using System;
class B { public void F() => Console.WriteLine("B.F"); }
class C : B {
public new void F() => Console.WriteLine("C.F");
public static void PrintStuff() {
C c = new C();
B b = c;
c.F(); b.F(); ((C)b).F();
}
}
class Program { static void Main() => C.PrintStuff(); }
Ответ
Вывод: C.F, B.F, C.F. Метод не виртуальный, поэтому при сокрытии через new выбор зависит от статического типа выражения; объект при этом остаётся одним экземпляром C.
Вызов через c выбирает C.F, через b — B.F, а приведение возвращает выражению тип C. Ключевое слово new делает сокрытие явным и убирает предупреждение; оно не включает полиморфную диспетчеризацию. Для поведения по фактическому типу объекта B.F должен быть virtual, а C.F — override: тогда все три вызова выбрали бы переопределение C.
Источник: learn.microsoft.com.