Не определяемые пользователем структуры наследуют перегруженный == оператор?
Если ссылочный тип не перегружает оператор равенства ==
, тогда вместо него будет использоваться оператор равенства на основе Object
. Почему это не верно для пользовательских structs
:
struct A{ }
static void Main(string[] args)
{
A a = new A();
A a1 = new A();
bool equal= (a == a1); //error
}
А именно, не ValueType
(из которого все вывод structs
) также перегружает оператор ==
?
Ответы
Ответ 1
Как работает такой оператор по умолчанию ==? Для ссылочных типов сопоставление адресов является разумным, но поскольку эта проверка никогда не будет верна для двух значений ValueTypes (поскольку, если два значения в области видимости находятся в области видимости, то они гарантированно имеют разные местоположения в стеке), сравнение адресов бессмысленно.
Как пояснил компилятор, ValueType очень преднамеренно не имеет оператора по умолчанию ==.
Ответ 2
Структуры, вероятно, не предоставляют реализацию по умолчанию ==, потому что, в отличие от экземпляра класса, структура не имеет понятия идентичности эталонного стиля.
Из рекомендаций:
Внедрение оператора равенства (==) по типам значений
В большинстве языков программирования есть нет реализации по умолчанию оператор равенства (==) для значения типы. Поэтому вы должны перегружать == любое время имеет смысл.
Вам следует рассмотреть возможность внедрения Метод равенства для типов значений, поскольку реализация по умолчанию System.ValueType не будет выполняться как а также ваша пользовательская реализация.
Реализация == в любое время, когда вы переопределяете Метод равенства.
Однако структуры предоставляют стандартную реализацию Equals Метод, которая будет выполнять по сравнению с использованием рефлекса.