C# allows user-defined types to overload operators by defining static member functions using the operator keyword. Not all operators can be overloaded, however, and others have restrictions, as listed in this table:
Operators | Overloadability |
---|---|
+, -, !, ~, ++, --, true, false | These unary operators can be overloaded. |
+, -, *, /, %, &, |, ^, <<, >> | These binary operators can be overloaded. |
==, !=, <, >, <=, >= | The comparison operators can be overloaded (but see note below). |
&&, || | The conditional logical operators cannot be overloaded, but they are evaluated using & and |, which can be overloaded; see CLR 7.11.2 User-defined conditional logical operators. |
[] | The array indexing operator cannot be overloaded, but you can define indexers. |
() | The cast operator cannot be overloaded, but you can define new conversion operators (see explicit and implicit). |
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= | Assignment operators cannot be overloaded, but +=, for example, is evaluated using +, which can be overloaded. |
=, ., ?:, ->, new, is, sizeof, typeof | These operators cannot be overloaded. |
Note The comparison operators, if overloaded, must be overloaded in pairs; that is, if == is overloaded, != must also be overloaded. The reverse is also true, and similarly for < and >, and for <= and >=.