Почему пустой обработчик события делегата может вызвать предупреждение CA1061?

Обновление:Это происходит, когда параметр анализа кода «Подавлять результаты сгенерированного кода (, управляемого только )» отключен, а для набора правил установлено значение «Правила Microsoft Basic Design Guideline Rules».

В 2013 -04 -26 Microsoft подтвердила, что это ошибка, но не будет исправлять ее ни в этой, ни в следующей версии Visual Studio.

Ссылка на элемент MS Connect

Мы часто инициализируем обработчики событий с пустым делегатом, чтобы избежать необходимости проверки нулей. Например.:

public EventHandler SomeEvent = delegate {};

Однако с тех пор, как мы начали компилировать часть нашего кода в Visual Studio 2012 (RTM ), я заметил, что многие события в производных классах теперь вызывают CA1601 :Не скрывать методы базового класса предупреждений в анализе кода Visual Studio 2012.

Вот пример, который вызовет предупреждение:

using System;
using System.ComponentModel;

[assembly: CLSCompliant( true )]

namespace TestLibrary1
{
    public abstract class Class1
    {
        public event PropertyChangedEventHandler PropertyChanged = delegate {};
    }

    public class Class2 : Class1
    {
        // this will cause a CA1061 warning
        public event EventHandler SelectionCancelled = delegate { };
    }

    public class Class3 : Class1
    {
        // this will not cause a CA1061 warning
        public event EventHandler SelectionCancelled;
    }
}

Примечание. :В VS2012 предупреждение срабатывает при компиляции в.NET 4.5 или.NET 4.0. Тот же образец не вызывает предупреждение в VS2010.

Помимо соображений производительности, есть ли законные причины, по которым мы не должны инициализировать события с пустыми делегатами? По умолчанию предполагается, что это, вероятно, просто особенность анализа в Visual Studio 2012.

Вот результат анализа кода для тех, у кого еще нет доступа к VS2012:

CA1061 Do not hide base class methods Change or remove 'Class2.Class2()' because it hides a more specific base class method: 'Class1.Class1()'. TestLibrary1 Class1.cs 14

Приложение:Я обнаружил, что параметр «Подавлять результаты из сгенерированного кода» в анализе кода отключен.

Также,Я обнаружил, что это происходит, когда обработчик событий в базовом типе одновременно:

  • делегат, отличный от EventHandler или EventHandler -и-
  • события как в базовом, так и в производном классе инициализируются с помощью анонимного метода или пустого делегата (либо встроенного, либо в конструкторе ).

Возможно, актуально :Мы используем Visual Studio 2012 RTM, которая была установлена ​​в -месте поверх кандидата на выпуск.

17
задан Sean 26 April 2013 в 22:02
поделиться