Хорошие вопросы.Позвольте мне переформулировать их.
Почему законно вообще скрывать метод с другим методом?
Позвольте мне ответить на этот вопрос с примером.У вас есть интерфейс от CLR v1:
interface IEnumerable
{
IEnumerator GetEnumerator();
}
Super.Теперь в CLR v2 у вас есть дженерики, и вы думаете: «мужик, если бы у нас были дженерики в v1, я бы сделал это универсальным интерфейсом. Но я не сделал. универсальный, так что я получаю преимущества универсальных шаблонов, не теряя обратной совместимости с кодом, который ожидает IEnumerable. "
interface IEnumerable<T> : IEnumerable
{
IEnumerator<T> .... uh oh
Как вы собираетесь вызывать метод GetEnumerator IEnumerable<T>
?Помните, вы хотите скрыть GetEnumerator в неуниверсальном базовом интерфейсе.Вы никогда не хотите, чтобы эта вещь вызывалась, если вы явно не находитесь в ситуации обратного сжатия.
Одно это оправдывает сокрытие метода.Для получения дополнительной информации об обоснованиях скрытия методов см. мою статью на эту тему .
Почему скрытие без «нового» вызывает предупреждение?
Потому что мы хотим обратить ваше внимание на то, что вы что-то скрываете и, возможно, делаете это случайно. Помните, что вы могли скрывать что-то случайно из-за редактирования базового класса, сделанного кем-то другим, а не редактированием вашего производного класса.
Почему скрывается без "новое "предупреждение, а не ошибка?
По той же причине.Вы можете что-то скрывать случайно, потому что вы только что подобрали новую версию базового класса.Это происходит все время.FooCorp создает базовый класс B. BarCorp создает производный класс D с методом Bar, потому что его клиентам нравится этот метод.FooCorp видит это и говорит: эй, это хорошая идея, мы можем поместить эту функциональность в базовый класс.Они делают это и поставляют новую версию Foo.DLL, и когда BarCorp забирает новую версию, было бы хорошо, если бы им сказали, что их метод теперь скрывает метод базового класса.
Нам нужна такая ситуациябыть предупреждением , а не ошибкой , потому что создание ошибки означает, что это еще одна форма проблемы хрупкого базового класса .C # был тщательно спроектирован таким образом, чтобы при внесении изменений в базовый класс влияние на код, использующий производный класс, было минимальным.
Почему скрывается и не переопределяется значение по умолчанию?
Поскольку виртуальное переопределение опасно .Виртуальное переопределение позволяет производным классам изменять поведение кода, скомпилированного для использования базовых классов.Выполнение чего-то опасного, например переопределения, должно быть тем, что вы делаете сознательно и сознательно , а не случайно.