В структуре допустимо ли реализовывать оператор == через Equals, но не переопределять Equals и GetHashCode? - PullRequest
3 голосов
/ 06 сентября 2010

Это действительно?

public struct MyStruct
{
    public int Foo { get; set; }

    public static bool operator ==(MyStruct a, MyStruct b)
    {
        return a.Equals(b);
    }

    public static bool operator !=(MyStruct a, MyStruct b)
    {
        return !a.Equals(b);
    }
}

(я знаю, что это немного неэффективно, потому что Object.Equals по умолчанию использует отражение для типов значений. Но так ли это?)

Я спрашиваю, потому что ReSharper выделяет это и предупреждает, что MyStruct defines operator '==' or operator '!=' but does not provide 'Object.Equals(object o)' and 'Object.GetHashCode()'.

Ответы [ 3 ]

4 голосов
/ 06 сентября 2010

Я думаю это может быть интересным.

3 голосов
/ 06 сентября 2010

Действительно? Да. Но это ничего вам не даст.

2 голосов
/ 06 сентября 2010

Это действительно с точки зрения того, что оно компилируется. Но он «недопустим» в том смысле, что он нарушает все ожидания пользователей вашего класса - руководящие принципы разработки инфраструктуры указывают, что вы не должны реализовывать функциональность, которая существует только при перегрузках операторов, - что такие методы должны быть доступны другими способами. И стандартом является то, что Object.Equals и operator == реализуют одинаковую функциональность.

(На данный момент можно найти только версию 1.1 руководства) :

Предоставить альтернативные подписи. Наиболее языки не поддерживают оператор перегрузка. По этой причине это Требование CLS для всех типов, которые операторы перегрузки, чтобы включить вторичный метод с соответствующим доменное имя, которое обеспечивает эквивалентная функциональность. Это Спецификация общего языка (CLS) Требование предоставить этот вторичный метод. Следующий пример CLS-совместимый.

...