gpt4 book ai didi

c# - 隐式方法组转换陷阱

转载 作者:可可西里 更新时间:2023-11-01 09:02:16 24 4
gpt4 key购买 nike

我想知道为什么给定代码的输出(在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com