2008年1月26日土曜日

Dictionary<TKey, TValue>とIEquatable<T>

ある意味当たり前ですが、気づかずにはまってしまいました。
Dictionary<TKey,TValue>はIEquatable<T>が実装されていればそれを使って比較してくれます。Object.Equals()と違って型保証されているので便利に使っていました。
しかし、Dictionary<TKey,TValue>はTKeyを比較する前にまずハッシュします。この際、IEquatable<T>の有無にかかわらずObject.GetHashCode()を使います。つまり、このハッシュ値が異なるTKeyはIEquatable<T>.Equals()が呼び出されることなく異なる値として扱われてしまいます。
むーん。

0 件のコメント: