Consider the following class:
public class Code : IEquatable<Code> 
{
    public string Value { get; set; }
    public override bool Equals(object obj)
    {
         return Equals(obj as Code);
    }
    public override bool Equals(Code code)
    {
         if (code == null) return false;
         return this.Value == code.Value;
    }
    public static bool operator ==(Code a, Code b)
    {
         if (a == null) return b == null;
         return a.Equals(b);
    }
    public static bool operator !=(Code a, Code b)
    {
         if (a == null) return b!= null;
         return !a.Equals(b);
    }
    // rest of the class here
}
Now try using the == method:
Code a = new Code();
Code b = new Code();
Console.WriteLine("The same? {0}", a==b);
The result is a StackOverflowException because the == method calls itself when it checks for null.
But if I take out the null check:
public static bool operator ==(Code a, Code b)
{
    return a.Equals(b);
}
I get a NullReferenceException!
What's the correct way to define these methods?
 
     
     
    