Для классов == и! = Использует object.ReferenceEquals.Но для структур == и! = Не определено.
struct S { }
S s1 = new S();
s1 is ValueType; // true
S s2 = new S();
object.Equals(s1, s2); // true
s1 == s2; // operator '==' cannot be applied.
Поведение по умолчанию для ValueType equals отражает все поля и проверяет равенство, верно ..?Так почему бы не определить == и! = Просто использовать object.Equals для структур?
Затем я взглянул на System.Int32 в Mono, чтобы увидеть, что они сделали .. Int32 происходит от IFormattable, IConvertible, IComparable, IComparable<Int32>, IEquatable<Int32>
, но он не реализует == и! = ... Но все же, == и! = могут использоваться на целых числах, как и ожидалось.
Есть ли какое-то волшебство компилятора, происходящее на одном из этих интерфейсов или свстроенные значения?Или я здесь упускаю что-то решающее?
Редактировать: Кстати, может причина == не реализована в структурах по соображениям производительности?Использование отражения для перебора всех полей может быть немного медленным ...?