在一个对性能要求较高的程序中,我试图显式地调用
同样虚构的代码展示了这个问题:
这段代码的输出结果是:
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的有关重载的文章,但仍然不理解这里的问题。所以我的问题是,我如何在上面的变量i中显式调用IEquatable<Foo>.Equals
?
Foo
是IEquatable<Foo>
。但是,一个IEquatable<Foo>
不是Foo
。这是否让你更清楚它为什么会按照这种方式工作 - 具体来说,为什么public bool Equals(Foo f)
不能使用IEquatable<Foo>
调用? - RB.i
是一个Foo
,那么可以使用i.Equals((Foo)i);
。但是,当你对其类型如此确定时,i
的声明类型不就是Foo
吗? - Damien_The_UnbelieverEquals
方法可供选择:Equals(Foo other)
和Equals(object obj)
。由于给定的参数i
被定义为IEquatable<Foo>
类型,因此必须选择对象重载。 - Pieter Witvoet