class MyNumber : IEquatable<MyNumber> { private int _x; public int X { get { return this._x; } set { this._x = value; } } public MyNumber(int x) { this._x = x; } public override int GetHashCode() { return this._x.GetHashCode(); } public override bool Equals(object obj) { if (obj == null) return base.Equals(obj); if (!(obj is MyNumber)) { throw new InvalidCastException("The 'obj' argument is not a MyNumber object."); } else { return Equals(obj as MyNumber); } } #region IEquatable<MyNumber> Members public bool Equals(MyNumber other) { if (other == null) { return false; } else { return (other.X == this.X); } } #endregion public static bool operator ==(MyNumber a, MyNumber b) { if (object.ReferenceEquals(a, b)) return true; if (object.ReferenceEquals(a, null)) return false; if (object.ReferenceEquals(b, null)) return false; return a.Equals(b); } public static bool operator !=(MyNumber a, MyNumber b) { return !(a == b); } }
MyNumber a = new MyNumber(10); MyNumber b = new MyNumber(10); Console.WriteLine(a.Equals(b)); // True Console.WriteLine(a == b); // True