Разве пользовательские структуры не наследуют перегруженный оператор ==? - PullRequest
2 голосов
/ 12 мая 2011

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

struct A{ }

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

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

Ответы [ 2 ]

5 голосов
/ 12 мая 2011

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

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

4 голосов
/ 12 мая 2011

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

Из руководящих принципов :

Реализация оператора равенства (==) для типов значений

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

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

Реализация == каждый раз, когда вы переопределяете Метод равных.

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

...