首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在重写GetHashCode()的类型上使用Object.GetHashCode()

如何在重写GetHashCode()的类型上使用Object.GetHashCode()
EN

Stack Overflow用户
提问于 2010-01-24 00:56:40
回答 2查看 1.7K关注 0票数 5

我有一个实现IEquatable<>的类A,它使用它的字段(比如A.b和A.c)来实现/覆盖Equals()和覆盖GetHashCode(),并且在99%的情况下一切正常。类A是层次结构(类B,C)的一部分,所有这些类都继承自接口D;它们都可以一起存储在一个字典字典中,因此当它们都带有自己的默认Equals()/GetHashCode()时很方便。

然而,在构建A时,我有时需要做一些工作来获取A.b和A.C的值;当发生这种情况时,我希望存储对正在构建的实例的引用。在这种情况下,我不想使用A提供的默认Equals()/GetHashCode()重写。因此,我在考虑实现一个ReferenceEqualityComparer,这意味着强制使用对象的Equals()/GetHashCode():

代码语言:javascript
复制
    private class ReferenceEqualityComparer<T> : IEqualityComparer<T>
    {
        #region IEqualityComparer<T> Members
        public bool Equals(T x, T y)
        {
            return System.Object.ReferenceEquals(x, y);
        }

        public int GetHashCode(T obj)
        {
            // what goes here? I want to do something like System.Object.GetHashCode(obj);
        }
        #endregion
    }

问题是,由于A覆盖了Object.GetHashCode(),我如何(在A之外)为A的实例调用Object.GetHashCode()?

当然,一种方法是A不实现IEquatable<>,并且总是为我创建的任何字典提供IEqualityComparer<>,但我希望得到一个不同的答案。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-29 11:16:26

RuntimeHelpers.GetHashCodeobject.ReferenceEquals的天然匹配项。

有关详细信息和ObjectReferenceEqualityComparer<T>的实现,请参阅此问题的答案:Built-in IEqualityComparer that uses ReferenceEquals

票数 7
EN

Stack Overflow用户

发布于 2010-03-29 11:13:22

通过互操作调用CLR的基础实现:Default implementation for Object.GetHashCode()

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2123888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档