Основная конструкция C# - объявление класса или структуры.
Классы и структуры есть типы. Тип характеризуется неизменяемым набором свойств и методов. Для встроенных типов определены множества преобразований (операций), которые кодируются с использованием предопределённого множества операций. Язык позволяет строить сложные выражения с использованием этих операций, причём результат выполнения (определения результирующего значения) зависит от типа составляющих сложное выражение элементарных выражений. Например, сложение целочисленных значений определяется и выполняется иначе, нежели сложение чисел с плавающей точкой.
Программист может строить сложные выражения с использованием символов арифметических, логических, операций сравнения и прочих операций на основе элементарных выражений встроенных типов.
Вновь объявляемые классы служат основой для создания объектов. Эти объекты в принципе ничем не отличаются от других объектов, в том числе от объектов-представителей элементарных аривметических типов. В частности, ссылки на такие объекты могут использоваться как элементарные выражения в выражениях более сложной структуры.
Для построения сложных выражений на основе элементарных выражений производных (объявляемых программиистом) типов C# предоставляет те же возможности, что и для выражений всех прочих типов. При этом главная проблема заключается в том, что алгоритм вычисления значения представленного операндами вновь объявляемого типа, в сочетании с символом операции ‘+’ (например) для операндов этого типа неизвестен. Семантика операции должна быть специальным образом определена программистом при определении класса.
Перегрузка операций в C# как раз и является способом объявления семантики операций, обозначаемых привычным набором символов операций. Перегрузка операций строится на основе общедоступных (public) статических (вызываемых от имени класса) функций-членов с использованием ключевого слова operator.
Не все операции множества могут быть переопределены подобным образом. Не все операции могутбыть перегружены. Некоторые операции могут перегружаться с ограничениями.
В таблице приводится соответствующая информация различных категорий символов операций:
Условные логические операции моделируются с использованием ранее переопределённых операций & и |.
[]
Операции доступа к элементам массивов моделируются за счёт индексаторов.
()
Операции преобразования реализуются с ипользованием ключевых слов implicit и explicit.
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
Операции не перегружаются, по причине невозможности перегрузки операции прсвоения.
=, ., ?:, ->, new, is, sizeof, typeof
Операции, не подлежащие перегрузке.
Префиксные операции ++ и -- перегружаются парами.
Операции сравнения перегружаются парами. Если перегружается операция ==, также должна перегружаться опеация !=. То же самое относится к парам < и >, <= и >=.