Не определяемые пользователем структуры наследуют перегруженный == оператор? - программирование

Не определяемые пользователем структуры наследуют перегруженный == оператор?

Если ссылочный тип не перегружает оператор равенства ==, тогда вместо него будет использоваться оператор равенства на основе Object. Почему это не верно для пользовательских structs:

struct A{ }

static void Main(string[] args)
{
    A a = new A();
    A a1 = new A();
    bool equal= (a == a1); //error
} 

А именно, не ValueType (из которого все вывод structs) также перегружает оператор ==?

4b9b3361

Ответ 1

Как работает такой оператор по умолчанию ==? Для ссылочных типов сопоставление адресов является разумным, но поскольку эта проверка никогда не будет верна для двух значений ValueTypes (поскольку, если два значения в области видимости находятся в области видимости, то они гарантированно имеют разные местоположения в стеке), сравнение адресов бессмысленно.

Как пояснил компилятор, ValueType очень преднамеренно не имеет оператора по умолчанию ==.

Ответ 2

Структуры, вероятно, не предоставляют реализацию по умолчанию ==, потому что, в отличие от экземпляра класса, структура не имеет понятия идентичности эталонного стиля.

Из рекомендаций:

Внедрение оператора равенства (==) по типам значений

В большинстве языков программирования есть нет реализации по умолчанию оператор равенства (==) для значения типы. Поэтому вы должны перегружать == любое время имеет смысл.

Вам следует рассмотреть возможность внедрения Метод равенства для типов значений, поскольку реализация по умолчанию System.ValueType не будет выполняться как а также ваша пользовательская реализация.

Реализация == в любое время, когда вы переопределяете Метод равенства.

Однако структуры предоставляют стандартную реализацию Equals Метод, которая будет выполнять по сравнению с использованием рефлекса.