Operator Overload C# Tutorial

using System;
public struct Complex : IComparable, IEquatable, IComparable{
    public Complex( double real, double img ) {
        this.real = real;
        this.img = img;
    }
    public override bool Equals( object other ) {
        bool result = false;
        if( other is Complex ) {
            result = Equals( (Complex) other );
        }
        return result;
    }
    public bool Equals( Complex that ) {
        return (this.real == that.real && this.img == that.img);
    }
    public override int GetHashCode() {
        return (int) this.Magnitude;
    }
    public int CompareTo( Complex that ) {
        int result;
        if( Equals( that ) ) {
            result = 0;
        } else if( this.Magnitude > that.Magnitude ) {
            result = 1;
        } else {
            result = -1;
        }
        return result;
    }
    int IComparable.CompareTo( object other ) {
        if( !(other is Complex) ) {
            throw new ArgumentException( "Bad Comparison" );
        }
        return CompareTo( (Complex) other );
    }
    public override string ToString() {
        return String.Format( "({0}, {1})", real, img );
    }
    public double Magnitude {
        get {
            return Math.Sqrt( Math.Pow(this.real, 2) + Math.Pow(this.img, 2) );
        }
    }
    public static bool operator==( Complex lhs, Complex rhs ) {
        return lhs.Equals( rhs );
    }
    public static bool operator!=( Complex lhs, Complex rhs ) {
        return !lhs.Equals( rhs );
    }
    public static bool operator<( Complex lhs, Complex rhs ) {
        return lhs.CompareTo( rhs ) < 0;
    }
    public static bool operator>( Complex lhs, Complex rhs ) {
        return lhs.CompareTo( rhs ) > 0;
    }
    public static bool operator<=( Complex lhs, Complex rhs ) {
        return lhs.CompareTo( rhs ) <= 0;
    }
    public static bool operator>=( Complex lhs, Complex rhs ) {
        return lhs.CompareTo( rhs ) >= 0;
    }
    private double real;
    private double img;
}
public class MainClass
{
    static void Main() {
        Complex cpx1 = new Complex( 1.0, 3.0 );
        Complex cpx2 = new Complex( 1.0, 2.0 );
        Console.WriteLine( "cpx1 = {0}, cpx1.Magnitude = {1}", cpx1, cpx1.Magnitude );
        Console.WriteLine( "cpx2 = {0}, cpx2.Magnitude = {1}\n", cpx2, cpx2.Magnitude );
        Console.WriteLine( "cpx1 == cpx2 ? {0}", cpx1 == cpx2 );
        Console.WriteLine( "cpx1 != cpx2 ? {0}", cpx1 != cpx2 );
        Console.WriteLine( "cpx1 <  cpx2 ? {0}", cpx1 < cpx2 );
        Console.WriteLine( "cpx1 >  cpx2 ? {0}", cpx1 > cpx2 );
        Console.WriteLine( "cpx1 <= cpx2 ? {0}", cpx1 <= cpx2 );
        Console.WriteLine( "cpx1 >= cpx2 ? {0}", cpx1 >= cpx2 );
    }
}
cpx1 = (1, 3), cpx1.Magnitude = 3.16227766016838
cpx2 = (1, 2), cpx2.Magnitude = 2.23606797749979
cpx1 == cpx2 ? False
cpx1 != cpx2 ? True
cpx1 cpx2 ? True
cpx1 = cpx2 ? True