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

C# 如何在重写GetHashCode()的类型上使用Object.GetHashCode(),c#,gethashcode,iequatable,iequalitycomparer,referenceequals,C#,Gethashcode,Iequatable,Iequalitycomparer,Referenceequals,我有一个实现IEquatable的类a,使用它的字段(比如a.b和a.c)来实现/重写Equals()和GetHashCode(),并且在99%的时间内一切都很好。类A是从接口D继承的层次结构(类B、C)的一部分;它们都可以一起存储在字典中,因此当它们都带有自己的默认Equals()/GetHashCode()时就很方便了 然而,在构造A时,我有时需要做一些工作来获得A.b和A.c的值;在这种情况下,我希望存储对正在构建的实例的引用。在这种情况下,我不想使用A提供的默认Equals()/GetH

我有一个实现IEquatable的类a,使用它的字段(比如a.b和a.c)来实现/重写Equals()和GetHashCode(),并且在99%的时间内一切都很好。类A是从接口D继承的层次结构(类B、C)的一部分;它们都可以一起存储在字典中,因此当它们都带有自己的默认Equals()/GetHashCode()时就很方便了

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

私有类引用EqualityComparer:IEqualityComparer
{
#地区资格比较成员
公共布尔等于(TX,TY)
{
返回System.Object.ReferenceEquals(x,y);
}
公共int GetHashCode(T obj)
{
//这里是什么?我想做一些类似System.Object.GetHashCode(obj)的事情;
}
#端区
}
问题是,既然重写了Object.GetHashCode(),我如何(在外部)调用对象的实例的Object.GetHashCode()

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


感谢通过interop调用CLR的基本实现:

对象的自然匹配。ReferenceEquals是


请参阅此问题的答案,以了解完整的详细信息和
对象引用平等比较程序的实现。

您正在为自己挖一个相当深的坑。使用IEqualityComparer退出吧。出于学术目的,该链接很有趣,但您应该真正使用
RuntimeHelpers.GetHashCode()
。没错,我不知道这个。它只调用完全相同的底层互操作方法,因此没有功能上的区别(但是是的:您应该使用发布的API,以防它发生变化等等)
    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
    }