Не объявляйте виртуальные события в базовом классе. Переопределенные события в производном классе имеют неопределенное поведение. Компилятор C# не обрабатывает это правильно, и невозможно предсказать, будет ли подписчик на производное событие действительно подписываться на событие базового класса.
А?
Официальное руководство по программированию на C# подтверждает это, используя очень похожую формулировку:
Не объявляйте виртуальные события в базе class и переопределить их в производном классе. Компилятор C# обрабатывает их неправильно, и невозможно предсказать, будет ли подписчик на производное событие действительно подписываться на событие базового класса.
А?
С другой стороны:
В официальном справочнике по языку C# для ключевого слова 'event' указано:Используйте ключевое слово virtual, чтобы пометить событие как виртуальное. Производные классы могут переопределить поведение события, используя ключевое слово override. Дополнительные сведения см. в разделе Наследование. [...]
Официальная спецификация языка C# гласит для событий:
Объявление виртуального события указывает, что средства доступа к этому событию являются виртуальными. Модификатор virtual применяется к обоим методам доступа события.
и
За исключением различий в синтаксисе объявления и вызова, виртуальные, запечатанные, переопределяющие и абстрактные методы доступа ведут себя точно так же, как виртуальные, запечатанные, переопределяющие и абстрактные методы.
Мне кажется, что вышеперечисленное несовместимо: либо правило анализа кода и руководство по программированию что-то скрывают, или спецификация языка и ссылка на язык неверны. Итак, что же это такое?
- Является ли спецификация языка и ссылки выдачей желаемого за действительное, описывающей функцию, которую невозможно было бы реализовать так, как описано?
- Пытаются ли правила анализа кода и руководство по программированию защитить программиста от ошибки компилятора?
- Кто-нибудь когда-либо мог воспроизвести «неопределенное поведение», неправильное обработка или непредсказуемость, о которой предупреждают правила анализа кода и руководство по программированию?
Мобильная версия