小编Tom*_*m19的帖子

编译器选择错误的重载调用IEquatable <T> .Equals

在性能敏感的程序中,我试图显式调用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

c# overloading iequatable

5
推荐指数
1
解决办法
126
查看次数

标签 统计

c# ×1

iequatable ×1

overloading ×1