У меня есть такой код:
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, причём, я буду ожидать, что эти условия эквивалентны. Не знаю, почему они не стали генерировать второй оператор сами, но причины его необходимости кажутся достаточно понятными - программист будет интуитивно ожидать, что второй ему тоже доступен.
В документации сказано:
При перегрузке операторов сравнения они должны перегружаться парами; то есть если оператор == перегружается, оператор != тоже должен перегружаться. Обратное также верно, и сказанное относится также к парам операторов < и >, <= и >=.
Обратите внимание, что не все операторы могут быть перегружены. Кроме того, некоторые операторы имеют ограничения.
Продвижение своими сайтами как стратегия роста и независимости