2

クラスからこれに出くわしたとき、私はILSpyでいくつかのシステムSystem.Internal.HandleCollectorクラスを熟読していました:

internal sealed class HandleCollector
{        
    ... bunch of stuff removed ...

    internal static event HandleChangeEventHandler HandleAdded
    {
        [MethodImpl(MethodImplOptions.Synchronized)]
        add
        {
            HandleCollector.HandleAdded = (HandleChangeEventHandler)Delegate.Combine(HandleCollector.HandleAdded, value);
        }
        [MethodImpl(MethodImplOptions.Synchronized)]
        remove
        {
            HandleCollector.HandleAdded = (HandleChangeEventHandler)Delegate.Remove(HandleCollector.HandleAdded, value);
        }
    }
    ... bunch of stuff removed ...
}

VisualStudioがプロパティにセッターがないと文句を言う(クラスをコピーした)場合、Microsoftはこれをどのようにコンパイルできますか?誰かがなぜこれが機能するのかを分析できますが、私のVSのコピーは文句を言います(ビルドフラグ?)?

このプロパティにはセッターがありません

エラーは各HandleCollector.HandleAdded =ステートメントにあります。

4

2 に答える 2

5

ここで入手できるので、MSソースコードが何であるかを推測する必要はありません。

HandleAddedこれは、 HandleCollector.csからの宣言です。

internal static event HandleChangeEventHandler HandleAdded; 

これは自動実装されたイベントです。問題はILSpyの逆コンパイルにあります。おそらく、バグを報告する必要があります。

于 2013-03-09T20:15:48.767 に答える
0

実装を追加および削除する代入でコンパイルする場合は、フィールドを使用する必要があります。

このような:

internal sealed class HandleCollector
{
    private static HandleChangeEventHandler HandleAddedField;

    internal static event HandleChangeEventHandler HandleAdded
    {
        [MethodImpl(MethodImplOptions.Synchronized)]
        add
        {
            HandleCollector.HandleAddedField = (HandleChangeEventHandler)Delegate.Combine(HandleCollector.HandleAddedField, value);
        }
        [MethodImpl(MethodImplOptions.Synchronized)]
        remove
        {
            HandleCollector.HandleAddedField = (HandleChangeEventHandler)Delegate.Remove(HandleCollector.HandleAddedField, value);
        }
    }
}
于 2013-03-09T20:12:45.360 に答える