17

更新:これは、コード分析オプション[生成されたコードからの結果の抑制(管理対象のみ)]がオフになっていて、ルールセットが[MicrosoftBasic設計ガイドラインルール]に設定されている場合に発生します。

2013-04-26に、Microsoftはこれがバグであることを確認しましたが、このバージョンまたは次のバージョンのVisualStudioでは修正されません。

MSコネクトアイテムへのリンク

nullをチェックする必要を避けるために、空のデリゲートでイベントハンドラーを初期化することがよくあります。例えば:

public EventHandler SomeEvent = delegate {};

ただし、Visual Studio 2012(RTM)でコードの一部をコンパイルし始めてから、派生クラスの多くのイベントがCA1601をトリガーしていることに気付きました。VisualStudio2012のコード分析で基本クラスメソッドの警告を非表示にしないでください。

警告をトリガーするサンプルは次のとおりです。

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では、.NET4.5または.NET4.0のいずれかでコンパイルされたときに警告がトリガーされます。同じサンプルは、VS2010で警告をトリガーしません。

パフォーマンス上の理由はさておき、空のデリゲートでイベントを初期化するべきではない正当な理由はありますか?デフォルトの想定では、これはおそらくVisualStudio2012での分析の癖にすぎません。

VS2012にまだアクセスできないユーザーのコード分析結果は次のとおりです。

CA1061基本クラスメソッドを非表示にしないより具体的な基本クラスメソッド「Class1.Class1()」を非表示にするため、「Class2.Class2()」を変更または削除します。TestLibrary1 Class1.cs 14

補遺:コード分析で「生成されたコードからの結果を抑制する」オプションがオフになっていることがわかりました。

また、これは、基本タイプのイベントハンドラーが次の両方の場合に発生するようです。

  • EventHandlerまたはEventHandler以外のデリゲート-および-
  • 基本クラスと派生クラスの両方のイベントは、匿名メソッドまたは空のデリゲート(インラインまたはコンストラクターのいずれか)を使用して初期化されます。

関連性の可能性:リリース候補の上にインプレースでインストールされたVisual Studio2012RTMを実行しています。

4

1 に答える 1

4

問題は、C#コンパイラが、インスタンスデリゲートの初期化に使用される静的デリゲートを生成することです。このデリゲートは、Class1とClass2の両方で同じ名前が付けられています。

Class1.CS$<>9__CachedAnonymousMethodDelegate1Class1のコンストラクターが初期化するためPropertyCancelledClass2.CS$<>9__CachedAnonymousMethodDelegate1_存在し、Class2のコンストラクターが初期化するために存在しますSelectionCancelled

残念ながら、C#コンパイラには、子クラスの自動生成された「もの」に名前を付ける方法を決定するときに、親クラスの「自動生成された」もののある種のレコードが含まれていません。ILDasmでこれをクラックすると、問題がすぐに明らかになります。回避策を見つけたことを知っておくとよいでしょう。C#に準拠していない名前のおかげで、C#から静的デリゲートに触れることができないため、警告を無視するのは完全に合理的です。

于 2012-08-24T23:10:20.880 に答える