ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-05-19 14:02:38  阅读:245  来源: 互联网

标签:c overloading iequatable


在性能敏感的程序中,我试图显式调用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并且离开时仍然没有理解这里的问题.所以我的问题是,如何在上面的变量i上显式调用IEquatable< Foo> .Equals?

解决方法:

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

由于编译器不检查IEquatable< Foo>的基础类型,因此如果要调用Equals(Foo)重载,则需要将参数显式转换为Foo.

标签:c,overloading,iequatable
来源: https://codeday.me/bug/20190519/1135774.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有