5

Equals() の実装/オーバーライドと GetHashCode() のオーバーライドにフィールド (Ab と Ac など) を使用して IEquatable<> を実装するクラス A があり、99% の確率ですべてが正常に動作します。クラス A は、すべてインターフェイス D から継承する階層 (クラス B、C) の一部です。それらはすべて辞書 Dictionary にまとめて格納できるため、すべてが独自のデフォルトの Equals()/GetHashCode() を持っている場合に便利です。

ただし、AI の構築中に、Ab と Ac の値を取得するために何らかの作業を行う必要がある場合があります。それが起こっている間、構築中のインスタンスへの参照を保存したいと思います。その場合、A が提供するデフォルトの Equals()/GetHashCode() オーバーライドを使用したくありません。したがって、オブジェクトの Equals()/GetHashCode() の使用を強制するための ReferenceEqualityComparer を実装することを考えていました。 :

    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<> を提供する方法もありますが、別の答えを期待しています。

ありがとう

4

2 に答える 2

7

の自然な一致はobject.ReferenceEqualsですRuntimeHelpers.GetHashCode

完全な詳細と実装については、この質問への回答を参照しくださいObjectReferenceEqualityComparer<T>IEqualityComparer<T>ReferenceEquals

于 2010-03-29T03:16:26.330 に答える
-1

相互運用機能を介してCLRの基本実装を呼び出します。Object.GetHashCode()のデフォルトの実装

于 2010-03-29T03:13:21.907 に答える