4

次のように辞書を実装しました。

Dictionary<ErrorHashKey, ErrorRow> dictionary;

クラスでEquals()andを定義しGetHashCode()ました。ErrorHashKey私は現在、プロジェクトのいくつかのドキュメントを作成しており、IEqualityComparer Interface docからこれに出くわしました:

ディクショナリには、キーが等しいかどうかを判断するための等価実装が必要です。比較パラメーターを受け入れるコンストラクターを使用して、IEqualityComparer ジェネリック インターフェイスの実装を指定できます。実装を指定しない場合、デフォルトの汎用等値比較子 EqualityComparer.Default が使用されます。TKey 型が System.IEquatable ジェネリック インターフェイスを実装している場合、既定の等値比較子はその実装を使用します。

ドキュメントで指定されていることは何もしていません (少なくとも、そうではないと思います)。コンストラクター パラメーターに比較子を渡したり、比較子を作成したりしませんEqualityComparer.Default

は、System.IEquatable<T> generic interface作成されたすべてのクラスに自動的に実装されますか? の実装を定義する必要がありIEqualityComparer<T>ますか?

4

2 に答える 2

7

デフォルトの比較プログラムは、実装されていない場合はobject.Equalsまたはobject.GetHashCode(オーバーライドされたメソッド)を呼び出しますIEquatable<T>。これは、のドキュメントにEqualityComparer<T>.Default記載されています。特別なことをする必要はありませんIEquatable<T>。また、クラスに自動的に実装されることもありません。

于 2012-08-21T14:46:43.503 に答える
1

質問の回答 ID:

実装を指定しない場合、デフォルトの汎用等値比較子 EqualityComparer.Default が使用されます

EqualsIEquatable を実装していない場合、EqualityComparer.Default はこのメソッドを使用しています。

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

ソース: http://msdn.microsoft.com/en-us/library/ms224763(v=vs.110).aspx

于 2012-08-21T14:48:34.153 に答える