Curiosidades de csharp equals no siempre es lo mismo que ==

Fijaos y escribid esto en el Visual Studio

object o1 = 5;
object o2 = 5;

System.Diagnostics.Debug.WriteLine(o1 == o2);
System.Diagnostics.Debug.WriteLine(o1.Equals(o2));
System.Diagnostics.Debug.WriteLine(((Int32) o1).CompareTo(o2));

La respuesta es:

False
True
0

¿Por qué? Pues por que el tipo Int32 (recordemos que esto se implemente usando struct lo que nos da un tipo por valor) sobreescribe el método Equals pero no el operador ==. Es decir == hace la comparación como una valirable por referencia, mientras que Equals lo hace como una variable por valor.

Así que cuidadin cuando sobreescribáis cosas, yo cuando me pongo a sobreescribir prefiero sobreescribirlo todo, por lo que pueda pasar ;)