作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想知道为什么给定代码的输出(在 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)
- 一个新的引用对象(委托(delegate)),其中包含指向存储在其中的实际方法的指针。
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, 类 [mscorlib]System.Delegate)
来比较委托(delegate)。
First 返回 false
,因为包装您的委托(delegate)的操作是两个不同的引用对象。
第二个返回 true
,因为在 Delegate
类上实现的相等运算符比较包装器(操作)内的实际目标。
关于c# - 隐式方法组转换陷阱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8938461/
我是一名优秀的程序员,十分优秀!