铸造后代表平等

时间:2012-07-19 09:12:24

标签: c# .net delegates

我正在尝试将WaitCallBack投射到Action<object>

我这样做是通过:

WaitCallBack w1 = Foo;

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

但是,当我尝试将a1a2进行比较时,它会返回false

是否有权力施放代表,以便平等成真?

感谢。

1 个答案:

答案 0 :(得分: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");
    }
}