加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 隐式方法组转换getcha

发布时间:2020-12-15 07:49:22 所属栏目:百科 来源:网络整理
导读:我想知道为什么给定代码的输出(在 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 在这两
我想知道为什么给定代码的输出(在 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

在这两种情况下,我都天真地期望它是真的.

解决方法

这是编译到IL然后反编译回C#时的外观.请注意,在这两种情况下,都有新的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,class [mscorlib] System.Delegate)to比较代表

首先返回false,因为包含代理的动作是两个不同的引用对象.

第二个返回true,因为在Delegate类上实现的等号运算符将比较封装(动作)中的实际目标.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读