我正在尝试将WaitCallBack
投射到Action<object>
我这样做是通过:
WaitCallBack w1 = Foo;
Action<object> a1 = new Action<object>(w1);
Action<object> a2 = Foo;
但是,当我尝试将a1
与a2
进行比较时,它会返回false
。
是否有权力施放代表,以便平等成真?
感谢。
答案 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");
}
}