Hi In the documentation is stated that the default constructor of Dictionary<TKey, TValue> will use EqualityComparer.Default, that will use the IEquatable interface if TKey implements it. That is not the case. If we set a breakpoint in the IEquatable<TKey>.Equals, it isn't called, and the Dictionary class seems to be basing its results on GetHashCode of TKey instances. This program:
public class A : IEquatable<A> { private int _i; public A(int i) { _i = i; } bool IEquatable<A>.Equals(A other) { return _i.Equals(other._i); } public static void Main() { if (!EqualityComparer<A>.Default.Equals(new A(2), new A(2))) Console.WriteLine("BUG 1"); Dictionary<A, int> d = new Dictionary<A, int>(); A a = new A(2); d.Add(a, 3); int value; if (!d.TryGetValue(new A(2), out value)) Console.WriteLine("BUG 2"); if (!d.TryGetValue(a, out value)) Console.WriteLine("BUG 3"); d = new Dictionary<A, int>(new EqualityComparer<A>.Default); d.Add(a, 3); if (!d.TryGetValue(new A(2), out value)) Console.WriteLine("BUG 4"); } } Will print: BUG2 BUG4 When it shouldn't print anything. The problem seems to be not in EqualityComparer<>.Default but in Dictionary that doesn't use it. Best regards, Gustavo Guerra _______________________________________________ Mono-devel-list mailing list Mono-devel-list@lists.ximian.com http://lists.ximian.com/mailman/listinfo/mono-devel-list