更新:これは、コード解析オプション "生成されたコードからの結果を抑制(管理のみ)"がオフになっており、ルールセットが "Microsoft Basic Design Guideline Rules"に設定されている場合に発生します。空のデリゲートイベントハンドラが原因でCA1061の警告が発生するのはなぜですか?
2012年4月26日、マイクロソフトでは、これがバグだと判断しましたが、このバージョンまたは次のバージョンのVisual Studioで修正されません。
私たちは頻繁にヌルをチェックするための必要性を回避するために、空のデリゲートとイベントハンドラを初期化します。例えば:Visual Studioの2012(RTM)に我々のコードの一部をコンパイルし始めているのでしかし、私は今のVisual Studio 2012のコード分析でCA1601: Do not hide base class methods警告をトリガしている派生クラスでイベントをたくさん気づい
public EventHandler SomeEvent = delegate {};
。
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;
}
}
注:
は、ここで警告がトリガされるサンプルの.NET 4.5または.NET 4.0のいずれかでコンパイルするとVS2012で警告がトリガされます。 VS2010で同じサンプルが警告をトリガーしません。
パフォーマンス上の理由を除いて、は、空の代理人でイベントを初期化してはならない正当な理由はありますか?
CA1061は非表示にしないでください:デフォルトの仮定は、それは、Visual Studioここでは、2012年
での分析では、単に癖がまだVS2012へのアクセスを持っていない人のためのコードの解析結果はおそらくだということです基本クラスメソッド「Class2.Class2()」は、より具体的な基本クラスメソッド「Class1.Class1()」を隠すため、変更または削除します。 TestLibrary1 Class1.csの14
補遺:私はコード解析の「生成されたコードの結果を抑制」するオプションがオフになっていることがわかりました。基底クラスとの両方でのEventHandlerかのEventHandler - と -
- デリゲート:
また、私はこれが基本型でのイベントハンドラの両方があるときに発生するようですことがわかりました派生クラスは、匿名メソッドまたは空のデリゲート(インラインまたはコンストラクタのいずれか)を使用して初期化されます。
可能性のあるもの:リリース候補よりインプレースにインストールされたVisual Studio 2012 RTMを実行しています。
イベントハンドラを起動する前にヌルチェックを行わないように、イベントハンドラをこのように初期化していますか? –
これが主な理由です。 – Sean
VS 2012の奇抜であると私は思っています。基本クラスの代理人を上書きしていた場合、私はそれを見ることができましたが、そのままではCA1061の記述とまったく同じではありません。http ://msdn.microsoft.com/en-us/library/ms182143.aspx –