1

をにキャストしようとしWaitCallBackていますAction<object>

私はこれをやっています:

WaitCallBack w1 = Foo;

Action<object> a1 = new Action<object>(w1);
Action<object> a2 = Foo;

ただし、 と を比較しようとするa1a2、 が返されfalseます。

平等が真になるように、デリゲートをキャストする場所はありますか?

ありがとう。

4

1 に答える 1

1

代表者はメソッド+ターゲットで比較します。問題は、さまざまなものを比較していることです。

この行をコンパイラーが認識するものに拡張すると、おそらくより明確になります。

Action<object> a1 = new Action<object>(w1);

実際には:

Action<object> a1 = new Action<object>(w1.Invoke);

Invoke(デリゲートに対する暗黙の操作を使用)

w1ターゲットがであり、メソッドがであることがわかりますInvoke。これを確認できます:

Console.WriteLine(a1.Method.Name); // Invoke
Console.WriteLine(ReferenceEquals(a1.Target, w1)); // true

他と比較してください:

Action<object> a2 = Foo;

ここで、ターゲットはnull(静的な場合)またはthis(非静的な場合)のいずれかであり、メソッドはFooです。デリゲートは同じではありません。報告するのは正しいですfalse

この連鎖操作は手動で確認できますが、特にすべての組み合わせ/深さを考慮する必要がある場合は、少し面倒です。しかし、些細な例:

Delegate del = a1.Target as Delegate;
if(del != null)
{
    if(del.Method == a2.Method && del.Target == a2.Target)
    {
        Console.WriteLine("pass");
    }
}
于 2012-07-19T09:23:58.053 に答える