在性能敏感的程序中,我试图显式调用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;
}
}
Run Code Online (Sandbox Code Playgroud)
同样可以设计的代码来证明这个问题:
// This calls IEquatable<Foo>
Foo f = new Foo();
f.Equals(f);
// This calls Object.Equals
IEquatable<Foo> i = new Foo();
i.Equals(i);
Run Code Online (Sandbox Code Playgroud)
此代码的输出是:
IEquatable.Equals
Object.Equals
Run Code Online (Sandbox Code Playgroud)
我阅读了Jon Skeet 关于重载的文章,但仍然没有理解这里的问题.所以我的问题是,我如何明确调用IEquatable<Foo>.Equals上面的变量i?