У меня есть такой код:
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# он не компилируется (сам пришел в с# после изучения с++). Соответсвенно возник вопрос, почему компилятор требует "парную" реализацию операторов <, >. Например в с++ такой код будет работать. Не могу понять причины такого дизайна в с#.
Потому что C#, в отличие от плюсов, заточен не на максимальную эффективность, а на максимальную предсказуемость.
Он сам реализует операторы комбинированного присваивания, гарантируя, что a+=b
будет работать так же, как a=a+b
.
И он требует чтобы парные операторы были реализованы в паре. Если я могу написать a<b
, то мне может захотеться написать и b>a
, причём, я буду ожидать, что эти условия эквивалентны. Не знаю, почему они не стали генерировать второй оператор сами, но причины его необходимости кажутся достаточно понятными - программист будет интуитивно ожидать, что второй ему тоже доступен.
В документации сказано:
При перегрузке операторов сравнения они должны перегружаться парами; то есть если оператор == перегружается, оператор != тоже должен перегружаться. Обратное также верно, и сказанное относится также к парам операторов < и >, <= и >=.
Обратите внимание, что не все операторы могут быть перегружены. Кроме того, некоторые операторы имеют ограничения.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Не могу понять в чем проблемаЯ доменный пользователь(не локальный), но задача следующая
Есть DataTable, который представляет из себя таблицу из 2 колонок: ИД и Наименование товараПодскажите, каким образом организовать обновление...
Как организовать отправку данных в формате JSON и файлов на удалённый сервер? И как правильно принять данные?