2

今日、一般的な辞書の単体テストを行っているときに、これに遭遇しました。

System.Collections.Generic.Dictionary<int, string> actual, expected;
actual = new System.Collections.Generic.Dictionary<int, string> { { 1, "foo" }, { 2, "bar" } };
expected = new System.Collections.Generic.Dictionary<int, string> { { 1, "foo" }, { 2, "bar" } };
Assert.AreEqual(expected, actual); //returns false

場合を除いて失敗しますactual == expected(オブジェクト参照は同じです)。明らかに、actual.Equals(expected)false も返します。

結構ですが、 の実装System.Collections.Generic.Dictionary<int, string>.Equalsが参照の等価性のみを行う場合、 のポイントはIEquatable何ですか? 言い換えれば、ジェネリック コレクションに対して値の等価性を実現する組み込みの方法がないのはなぜでしょうか?

編集これまでの回答に感謝します。明らかに私の例では値型を使用していますが、私の不満はすべてのオブジェクトに当てはまると思います。ジェネリック コレクションの等価性が、その型の等価性の和集合にならないのはなぜですか? 参照の等価性を見つけるための別の規定があるため、予期しない動作は実際には問題になりません。IEquatableKonrad Rudolph が指摘しているように、これにより、 を実装するオブジェクトのみを保持するコレクションの制約が導入されると思います。ただし、Dictionary のようなオブジェクトでは、これはあまり問題にならないようです。

4

3 に答える 3

2

Dictionary<T,T>.EqualsObject.Equals から継承されているため、オブジェクト参照の単純な比較を行います。

ジェネリック コレクションが値の等価性を意味しないのはなぜですか? それはあなたが望むものではないかもしれないからです。それらが同じインスタンスであるかどうかを確認したい場合があります。代替手段は何をしますか?各キーと値に対して Equals を呼び出しますか? これらが Object から Equals を継承するとどうなるでしょうか? それは完全に深い比較ではありません。

したがって、必要に応じて他のセマンティックを提供するのはあなた次第です。

于 2008-12-22T22:24:09.420 に答える
2

言い換えれば、ジェネリック コレクションに対して値の等価性を実現する組み込みの方法がないのはなぜでしょうか?

おそらく、辞書の値の型 (およびキーの型) も実装されている場合にのみ可能になるため、一般的な用語で定式化するのは難しいためIEquatableです。ただし、これを要求すると強すぎるため、Dictionaryこのインターフェイスを実装しない多くの型では使用できなくなります。

これは、制約付きジェネリックに固有の問題です。Haskell はこの問題の解決策を提供しますが、これにははるかに強力で複雑なジェネリクス メカニズムが必要です。

IComparableコンテナと比較しても同様のことが当てはまりますがComparer<T>.Default、必要に応じて使用して、これをサポートしていることに注意してください。

于 2008-12-22T22:25:35.283 に答える
1

Dictionary<TKey, TValue>は IEquatable を実装していません。そのため、そのような辞書を同じ内容の別の辞書と比較すると実際に何が生成されるかを判断/知るための正式な方法はありません。

実際、Dictionary<TKey, TValue>比較インターフェイスはまったく実装されていません。

私の意見では、2 つのオブジェクトを比較することはかなり特別なことなので、通常は望ましくないデフォルトの実装を基本オブジェクト クラスに配置するよりも、それをインターフェイスに配置する方がはるかに理にかなっています。これは、期待するほどではありませんが、すべてのオブジェクトが実行できる機能よりも、クラスの宣伝された機能である必要があります。

しかし、そこにあります。それはそこにあり、いつ使用されるかを知る必要があります。

この場合のように。

于 2008-12-22T22:25:32.193 に答える