今日、一般的な辞書の単体テストを行っているときに、これに遭遇しました。
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
何ですか? 言い換えれば、ジェネリック コレクションに対して値の等価性を実現する組み込みの方法がないのはなぜでしょうか?
編集これまでの回答に感謝します。明らかに私の例では値型を使用していますが、私の不満はすべてのオブジェクトに当てはまると思います。ジェネリック コレクションの等価性が、その型の等価性の和集合にならないのはなぜですか? 参照の等価性を見つけるための別の規定があるため、予期しない動作は実際には問題になりません。IEquatable
Konrad Rudolph が指摘しているように、これにより、 を実装するオブジェクトのみを保持するコレクションの制約が導入されると思います。ただし、Dictionary のようなオブジェクトでは、これはあまり問題にならないようです。