В этом article Эрик Липперт предлагает в пункте 9, что С# имеет "слишком большое равенство". Он указывает, что существует 9 или 10 различных методов или операторов, которые могут быть перегружены для обеспечения равенства объектов.
Мой первый вопрос: если метод Object.Equals(object) переопределен, возможно, компилятор может вызвать любой из других операторов равенства, таких как ==,! =, <= и т.д. без кода, явно выполняет эту операцию?
В С++ существует прецедент для этого поведения. Конструктор копирования может быть вызван компилятором в определенных местах, где необходимо создать временную переменную. Я, по крайней мере, на 95% уверен, что этого не может произойти в С#, но это действительно зависит от того, как компилятор сконструирован и, возможно, и кромки.
Второй вопрос: если компилятор никогда не будет ссылаться на какой-либо из операторов равенства косвенно, тогда было бы хорошо, если бы малый, средний или даже большой проект указывал, что только метод Object.Equals(object) и IEquatable использовать для тестирования равенства, а IComparable - если тип будет использоваться для сортировки или в другое время, когда требуется определить ранг объектов? Другими словами - нормально ли избегать определения других операторов равенства, если все участники проекта согласятся, что они не будут использоваться и, следовательно, не нужны?
Предположим, что код предназначен только для использования в проекте и не будет экспортирован для использования третьими лицами.