2012-08-16 14 views
17

更新:これは、コード解析オプション "生成されたコードからの結果を抑制(管理のみ)"がオフになっており、ルールセットが "Microsoft Basic Design Guideline Rules"に設定されている場合に発生します。空のデリゲートイベントハンドラが原因でCA1061の警告が発生するのはなぜですか?

2012年4月26日、マイクロソフトでは、これがバグだと判断しましたが、このバージョンまたは次のバージョンのVisual Studioで修正されません。

Link to MS Connect item

私たちは頻繁にヌルをチェックするための必要性を回避するために、空のデリゲートとイベントハンドラを初期化します。例えば: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を実行しています。

  • +0

    イベントハンドラを起動する前にヌルチェックを行わないように、イベントハンドラをこのように初期化していますか? –

    +0

    これが主な理由です。 – Sean

    +0

    VS 2012の奇抜であると私は思っています。基本クラスの代理人を上書きしていた場合、私はそれを見ることができましたが、そのままではCA1061の記述とまったく同じではありません。http ://msdn.microsoft.com/en-us/library/ms182143.aspx –

    答えて

    4

    問題は、C#コンパイラがインスタンスデリゲートを初期化するために使用される静的デリゲートを生成することです。インスタンスデリゲートは、Class1とClass2の両方で同じ名前が付けられています。 Class2.CS$<>9__CachedAnonymousMethodDelegate1_SelectionCancelledを初期化するためのクラス2のコンストラクターで使用するために存在している間

    Class1.CS$<>9__CachedAnonymousMethodDelegate1は、PropertyCancelledを初期化するのClass1のコンストラクターで使用するために存在します。

    子クラスの自動生成された「もの」の名前付け方法を決定するときに、C#コンパイラに親クラスの自動生成されたもののレコードが含まれていることは残念です。 ILDasmでこれを開ければ、問題は直ちに明らかになります。あなたは仕事を見つけたことを知りました。 C#の静的なデリゲートに触れることができないので、C#準拠の命名規則のおかげで、無視するのは完全に合理的です。

    +1

    これは確かに何が起きているのかについての合理的な説明ですが、なぜVisual Studioの最新バージョンで始まったのかについては言及していません。しかし、先週の2012年のコード分析では、イベントハンドラやLINQクエリに関連する匿名の方法についての奇妙な情報がたくさんありましたので、洞察に感謝します。 – Sean

    関連する問題