Что происходит с CA1070 «Не объявлять поля событий виртуальными»?C#

Место общения программистов C#
Ответить
Anonymous
 Что происходит с CA1070 «Не объявлять поля событий виртуальными»?

Сообщение Anonymous »

Официальная документация по правилу анализа кода DotNet CA1070 «Не объявляйте поля событий как виртуальные» гласит:

Не объявляйте виртуальные события в базовом классе. Переопределенные события в производном классе имеют неопределенное поведение. Компилятор C# не обрабатывает это правильно, и невозможно предсказать, будет ли подписчик на производное событие действительно подписываться на событие базового класса.

А?
Официальное руководство по программированию на C# подтверждает это, используя очень похожую формулировку:

Не объявляйте виртуальные события в базе class и переопределить их в производном классе. Компилятор C# обрабатывает их неправильно, и невозможно предсказать, будет ли подписчик на производное событие действительно подписываться на событие базового класса.

А?

С другой стороны:

В официальном справочнике по языку C# для ключевого слова 'event' указано:

Используйте ключевое слово virtual, чтобы пометить событие как виртуальное. Производные классы могут переопределить поведение события, используя ключевое слово override. Дополнительные сведения см. в разделе Наследование. [...]

Официальная спецификация языка C# гласит для событий:

Объявление виртуального события указывает, что средства доступа к этому событию являются виртуальными. Модификатор virtual применяется к обоим методам доступа события.

и

За исключением различий в синтаксисе объявления и вызова, виртуальные, запечатанные, переопределяющие и абстрактные методы доступа ведут себя точно так же, как виртуальные, запечатанные, переопределяющие и абстрактные методы.

Мне кажется, что вышеперечисленное несовместимо: либо правило анализа кода и руководство по программированию что-то скрывают, или спецификация языка и ссылка на язык неверны. Итак, что же это такое?
  • Является ли спецификация языка и ссылки выдачей желаемого за действительное, описывающей функцию, которую невозможно было бы реализовать так, как описано?
  • Пытаются ли правила анализа кода и руководство по программированию защитить программиста от ошибки компилятора?
  • Кто-нибудь когда-либо мог воспроизвести «неопределенное поведение», неправильное обработка или непредсказуемость, о которой предупреждают правила анализа кода и руководство по программированию?
Мне действительно любопытно.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»