#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 - эти операторы не могут быть перегружены.
Комментариев нет:
Отправить комментарий