gpt4 book ai didi

c# - 编译器选择错误的重载调用 IEquatable.Equals

转载 作者:太空狗 更新时间:2023-10-29 23:13:29 26 4
gpt4 key购买 nike

在性能敏感的程序中,我试图显式调用 IEquatable<T>.Equals()而不是 Object.Equals (在我的情况下避免拳击)。尽管我尽了最大努力,编译器总是选择 Object.Equals()相反 - 我不明白。一个人为的示例类:

class Foo : IEquatable<Foo>
{
public bool Equals(Foo f)
{
Console.WriteLine("IEquatable.Equals");
return true;
}

public override bool Equals(object f)
{
Console.WriteLine("Object.Equals");
return true;
}
}

演示问题的同样设计的代码:

// This calls IEquatable<Foo>
Foo f = new Foo();
f.Equals(f);

// This calls Object.Equals
IEquatable<Foo> i = new Foo();
i.Equals(i);

这段代码的输出是:

IEquatable.Equals
Object.Equals

我读了 Jon Skeet 的 article on overloading离开时仍然不明白这里的问题。所以我的问题是,如何显式调用 IEquatable<Foo>.Equals关于变量 i以上?

最佳答案

选择第二个重载的原因与调用者的类型无关。相反,它与您传递给 Equals 的参数类型有关.所以即使你调用f.Equals(i) , object.Equals方法将被选择。原因很简单,编译器寻找最合适的重载。自 IEquatable<Foo>不一定是 Foo ,因为可能还有另一种类型让我们说 Bar实现IEquatable<Foo> , 在这种情况下,选择 Equals(Foo f) 是不正确的(或不可能的)过载。

因为编译器不检查 IEquatable<Foo> 的底层类型, 您需要将参数显式转换为 Foo如果你想打电话Equals(Foo)过载。

关于c# - 编译器选择错误的重载调用 IEquatable<T>.Equals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35172790/

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