Почему == и! = По умолчанию не object.Equals для ValueTypes? - PullRequest
3 голосов
/ 08 июля 2010

Для классов == и! = Использует 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>, но он не реализует == и! = ... Но все же, == и! = могут использоваться на целых числах, как и ожидалось.

Есть ли какое-то волшебство компилятора, происходящее на одном из этих интерфейсов или свстроенные значения?Или я здесь упускаю что-то решающее?

Редактировать: Кстати, может причина == не реализована в структурах по соображениям производительности?Использование отражения для перебора всех полей может быть немного медленным ...?

Ответы [ 2 ]

2 голосов
/ 08 июля 2010

Сравнение для System.Int32 определено в норме C # в 14.9.1 Операторы сравнения целых чисел и отображаются непосредственно на коды операций IL, такие как OpCode.Ceq для равенства в компиляторе C #, чтобы они не были определены как стандартные операторы для типа System.Int32 напрямую.

Так что да, это волшебство компилятора.

2 голосов
/ 08 июля 2010

ValueTypes должны быть помещены в коробку, чтобы их можно было использовать в качестве (как вы их называете) типов или объектов. Да, бокс - это потеря производительности.

...