I'm currently working to implement reference equality in the SWIG bindings for OpenBabel. While doing some review I came across two pages which discuss some overlooked relationships between Object.Equals(object o), IEquatable<AType>.Equals(AType instance), and Object.GetHashCode().
So here is a little post-holiday reading:
Implementing IEquatable Properly
IEquatable(of T) and GetHashCode()