In this article, Eric Lippert suggests in point #9 that C# has "too much equality". He points out that there are 9 or 10 different methods or operators that can be overloaded to provide object equality.
My first question is - if the Object.Equals(object) method is overridden, is it possible for the compiler to call any of the other equality operators like ==, !=, <=, etc. without code that expressly performs this operation?
In C++, there is precedent for this behavior. The copy constructor can be called by the compiler in certain places where a temporary variable needs to be generated. I'm at least 95% certain that this can't happen in C#, but it really depends on how the compiler is constructed and maybe edge cases as well.
The second question is - if the compiler will never call any of the equality operators indirectly, then would it be ok for a small, medium, or even large project to specify that only the Object.Equals(object) method and IEquatable be used for equality testing, and IComparable used if the type will be used for sorting or other times when determining the rank of the objects is needed? In other words - is it ok to avoid defining the other equality operators if everyone on the project agrees they won't be used and are therefore unnecessary?
Assume that the code is only to be used within the project and won't be exported for use by third parties.