Страницы

Поиск по вопросам

четверг, 2 января 2020 г.

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

#c_sharp #дизайн_языка


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

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


Ответы

Ответ 1



Потому что C#, в отличие от плюсов, заточен не на максимальную эффективность, а на максимальную предсказуемость. Он сам реализует операторы комбинированного присваивания, гарантируя, что a+=b будет работать так же, как a=a+b. И он требует чтобы парные операторы были реализованы в паре. Если я могу написать aa, причём, я буду ожидать, что эти условия эквивалентны. Не знаю, почему они не стали генерировать второй оператор сами, но причины его необходимости кажутся достаточно понятными - программист будет интуитивно ожидать, что второй ему тоже доступен.

Ответ 2



В документации сказано: При перегрузке операторов сравнения они должны перегружаться парами; то есть если оператор == перегружается, оператор != тоже должен перегружаться. Обратное также верно, и сказанное относится также к парам операторов < и >, <= и >=. Обратите внимание, что не все операторы могут быть перегружены. Кроме того, некоторые операторы имеют ограничения. +, -, !, ~, ++, --, true, false - эти унарные операторы могут быть перегружены. +, -, *, /, %, &, | , ^, <<, >> - эти бинарные операторы могут быть перегружены. ==, !=, <, >, <=, >= - операторы сравнения могут быть перегружены &&, || - условные логические операторы не могут быть перегружены, но они оцениваются с помощью & и | , которые могут быть перегружены. [] - оператор индексирования массива не может быть перегружен, но можно определить индексаторы. (T)x - оператор приведения типов не может быть перегружен, но можно определить новые операторы преобразования +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= - операторы присваивания не могут быть перегружены, но +=, например, оценивается с помощью +, который может быть перегружен. =, ., ?:, ??, ->, =>, f(x), as, checked, unchecked, default, delegate, is, new, sizeof, typeof - эти операторы не могут быть перегружены.

Комментариев нет:

Отправить комментарий