1

我正在尝试将 aWaitCallBack转换为Action<object>

我这样做是:

WaitCallBack w1 = Foo;

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

但是,当我尝试比较a1with 时a2,它会返回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 回答