Исходя из фона С++, это стало для меня неожиданностью. В С++ хорошая практика сделать виртуальные функции частными. Из http://www.gotw.ca/publications/mill18.htm: "Руководство № 2: Предпочтение делать виртуальные функции частными".
Я также цитирую блог Эрика Липперта, Knights-knaves-protected-and-internal:
Частные виртуальные методы являются незаконными в С#, что раздражает меня до конца. я будет полностью использовать эту функцию, если бы мы ее имели.
Я понимаю, что в С# вы не сможете переопределить частный виртуальный метод в производном (но не вложенном) классе. Почему это так? В С++ спецификатор доступа не имеет никакого отношения к тому, можно ли переопределить функцию или нет.