Перегрузка оператора < в c#

360
24 января 2017, 21:05

У меня есть такой код:

public class Foo
{
    public static bool operator<(Foo l, Foo f)
    {
        Console.WriteLine("Foo!");
        return false;
    }
    //public static bool operator>(Foo l, Foo f)
    //{
    //    return f < l;
    //}
}

Я удивился, что в c# он не компилируется (сам пришел в с# после изучения с++). Соответсвенно возник вопрос, почему компилятор требует "парную" реализацию операторов <, >. Например в с++ такой код будет работать. Не могу понять причины такого дизайна в с#.

Answer 1

Потому что C#, в отличие от плюсов, заточен не на максимальную эффективность, а на максимальную предсказуемость.

Он сам реализует операторы комбинированного присваивания, гарантируя, что a+=b будет работать так же, как a=a+b.

И он требует чтобы парные операторы были реализованы в паре. Если я могу написать a<b, то мне может захотеться написать и b>a, причём, я буду ожидать, что эти условия эквивалентны. Не знаю, почему они не стали генерировать второй оператор сами, но причины его необходимости кажутся достаточно понятными - программист будет интуитивно ожидать, что второй ему тоже доступен.

Answer 2

В документации сказано:

При перегрузке операторов сравнения они должны перегружаться парами; то есть если оператор == перегружается, оператор != тоже должен перегружаться. Обратное также верно, и сказанное относится также к парам операторов < и >, <= и >=.

Обратите внимание, что не все операторы могут быть перегружены. Кроме того, некоторые операторы имеют ограничения.

  • +, -, !, ~, ++, --, true, false - эти унарные операторы могут быть перегружены.
  • +, -, *, /, %, &, | , ^, <<, >> - эти бинарные операторы могут быть перегружены.
  • ==, !=, <, >, <=, >= - операторы сравнения могут быть перегружены
  • &&, || - условные логические операторы не могут быть перегружены, но они оцениваются с помощью & и | , которые могут быть перегружены.
  • [] - оператор индексирования массива не может быть перегружен, но можно определить индексаторы.
  • (T)x - оператор приведения типов не может быть перегружен, но можно определить новые операторы преобразования
  • +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= - операторы присваивания не могут быть перегружены, но +=, например, оценивается с помощью +, который может быть перегружен.
  • =, ., ?:, ??, ->, =>, f(x), as, checked, unchecked, default, delegate, is, new, sizeof, typeof - эти операторы не могут быть перегружены.
READ ALSO
user credentials cannot be used for local connections wmi c#

user credentials cannot be used for local connections wmi c#

Не могу понять в чем проблемаЯ доменный пользователь(не локальный), но задача следующая

429
Как обновить ячейку DataTable

Как обновить ячейку DataTable

Есть DataTable, который представляет из себя таблицу из 2 колонок: ИД и Наименование товараПодскажите, каким образом организовать обновление...

460
Запрос в Linq C#

Запрос в Linq C#

Добрый день !

414
C# RestSharp и ASP NET Web API - передача json и файлов

C# RestSharp и ASP NET Web API - передача json и файлов

Как организовать отправку данных в формате JSON и файлов на удалённый сервер? И как правильно принять данные?

1114