using System; using System.Runtime.InteropServices; namespace Martin.Collections.Generic { [Serializable] public abstract class EqualityComparer : IEqualityComparer { static EqualityComparer () { if (typeof (IEquatable ).IsAssignableFrom (typeof (T))) _default = (EqualityComparer ) Activator.CreateInstance (typeof (IEquatableOfTEqualityComparer<>).MakeGenericType (typeof (T))); else _default = new DefaultComparer (); } public abstract int GetHashCode (T obj); public abstract bool Equals (T x, T y); static readonly EqualityComparer _default; public static EqualityComparer Default { get { return _default; } } [Serializable] class DefaultComparer : EqualityComparer { public override int GetHashCode (T obj) { return obj.GetHashCode (); } public override bool Equals (T x, T y) { if (x == null) return y == null; return x.Equals (y); } } } [Serializable] class IEquatableOfTEqualityComparer : EqualityComparer where T : IEquatable { public override int GetHashCode (T obj) { return obj.GetHashCode (); } public override bool Equals (T x, T y) { if (x == null) return y == null; return x.Equals (y); } } public interface IEqualityComparer { bool Equals (T x, T y); int GetHashCode (T obj); } class X { public static void Main () { } } }