我想知道为什么给定代码的输出(在 LinqPad 中执行)
void Main() {
Compare1((Action)Main).Dump();
Compare2(Main).Dump();
}
bool Compare1(Delegate x) {
return x == (Action)Main;
}
bool Compare2(Action x) {
return x == Main;
}
总是:
False
True
我天真地期望它是True
在这两种情况下。
这是编译为 IL 然后反编译回 C# 时的样子。请注意,在这两种情况下都有new Action(Main)
- 一个新的引用对象(委托),其中包含指向存储在其中的实际方法的指针。
private static void Main()
{
Program.Compare1(new Action(Program.Main)).Dump();
Program.Compare2(new Action(Program.Main)).Dump();
Console.ReadLine();
}
private static bool Compare1(Delegate x)
{
return x == new Action(Program.Main);
}
private static bool Compare2(Action x)
{
return x == new Action(Program.Main);
}
如果我们看一下 CIL,前者使用ceq
(参考对比)后者的用途call bool [mscorlib]System.Delegate::op_Equality(class [mscorlib]System.Delegate, class [mscorlib]System.Delegate)
比较代表。
首次回报false
因为包装委托的操作是两个不同的引用对象。
第二次回报true
作为在上实现的相等运算符Delegate
类比较包装器(操作)内的实际目标。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)