我有一種場景,其中IEnumerable.SequenceEqual
擴展方法返回false時,我不期望它 - 確切地說,當使用它來比較兩套(已知相同)ILookup<int, int>
。通過調試器,我發現我的兩個集合中的實際元素是Lookup<TKey, TElement>.Grouping
類的實例,所以我跳入了參考源。爲什麼Lookup <TKey,TValue> .Grouping類不提供相等覆蓋?
要長話短說,SequenceEqual
使用的默認相等比較器是ObjectEqualityComparer
,默認使用標準Object.Equals
。但Lookup<TKey, TElement>.Grouping
不會覆蓋Equals
,所以ObjectEqualityComparer
最終使用默認Object.Equals
方法,它調用到RuntimeHelpers.Equals
,這(我想,因爲它是extern
)做參考比較和返回false。
我看不出有什麼好的理由,爲什麼粗體部分應該是真的,因此這個問題。有人知道(或者可以解釋)這是否是一個故意的設計決定(如果是這樣,爲什麼) - 或者它只是一個無意的遺漏?
「...兩個IEnumerable實例因爲它們的元素相等而不相等,爲什麼IEnumerable 的這個特定實現有所不同?當你用這些術語來表達時,這是完全合理的。 –
2014-09-19 14:02:26