Equality can be “fussier” than comparison, but not vice versa.
CompareTo can say “All objects are equal”
while Equals says “But some are more equal than others!”
An example of this is System.String. String’s Equals method and == operator
use ordinal comparison, which compares the Unicode point values of each character.
Its CompareTo method, however, uses a less fussy culture-dependent comparison. On
most computers, for instance, the strings “ṻ” and “ǖ” are different according to
Equals, but the same according to CompareTo.
This is from C# in a nutshell