0

考慮事項:EqualityComparer.Defaultプロパティ、MSDNに書かれている:

Default プロパティは、型 T が System.IEquatable インターフェイスを実装しているかどうかを確認し、実装している場合は、その実装を使用する EqualityComparer を返します。それ以外の場合は、T によって提供される Object.Equals および Object.GetHashCode のオーバーライドを使用する EqualityComparer を返します。

私の理解: EqualityComparer "オブジェクト" が返されるため、T によって提供される Object.Equals および Object.GetHashCode のオーバーライドを呼び出す必要があります (それ以外の場合は Object.Equals および Object.GetHashCode をオーバーライドする場合)。IEquatable の実装されたメソッドをどのように呼び出すことができますか? 無理矢理やってるの?はいの場合、どのように?私が間違っている場合は修正してください。

MSDN リンクは次のとおりです: http://msdn.microsoft.com/en-us/library/ms224763.aspx

4

1 に答える 1

0

まず、次のようなジェネリッククラスでは、実際には正しいメソッド(IEquatable<T>)が選択されます。

    private class MyEqualityComparer<T> : IEqualityComparer<T> where T : IEquatable<T>
    {
        public bool Equals(T x, T y)
        {
            return x.Equals(y);
        }
        // Hashcode...
    }

一方、yをにキャストするobjectと、参照はになりますobject.Equals。これは単なるオーバーロードされたメソッドであるため、コンパイル時に解決されます。

于 2013-01-30T12:43:22.277 に答える