單元測試通用字典時,我今天遇到了這個問題。System.Collections.Generic.Dictionary <T,T> .Equals實際上做了什麼?
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
的對象的集合約束。然而,在像Dictionary這樣的對象中,這似乎並沒有太多要求。
另外,如果我們有一個對象字典包含自己呢?我們可能會先被程序員的小夥子殺死,但我們可能會以無限循環結束。 – configurator 2008-12-22 22:53:05
另一種方法是提供一個理智,一致的平等操作語義,而不是它目前的汞合金。除非我深入瞭解繼承堆棧,否則無法告訴Equals()實際上等同於什麼! – Noel 2008-12-22 23:32:44