C# Operator Overloading

All unary and binary operators have pre-defined implementations, that are automatically available in any expressions. In addition to this pre-defined implementations, user defined implementations can also be introduced in C#. The mechanism of giving a special meaning to a standard C# operator with respect to a user defined data type such as classes or structures is known as operator overloading. Remember that it is not possible to overload all operators in C#. The following table shows the operators and their overloadability in C#.

Operators Overloadability

+, -, *, /, %, &, |, <<, >> All C# binary operators can be overloaded.

+, -, !, ~, ++, –, true, false All C# unary operators can be overloaded.

==, !=, <, >, <= , >= All relational operators can be overloaded,
but only as pairs.

&&, || They can’t be overloaded

() (Conversion operator) They can’t be overloaded

+=, -=, *=, /=, %= These compound assignment operators can be
overloaded. But in C#, these operators are
automatically overloaded when the respective
binary operator is overloaded.

=, . , ?:, ->, new, is, as, size of These operators can’t be overloaded

In C#, a special function called operator function is used for overloading purpose. These special function or method must be public and static. They can take only value arguments.The ref and out parameters are not allowed as arguments to operator functions. The general form of an operator function is as follows.

public static return_type operator op (argument list)
Where the op is the operator to be overloaded and operator is the required keyword. For overloading the unary operators, there is only one argument and for overloading a binary operator there are two arguments. Remember that at least one of the arguments must be a user-defined type such as class or struct type.

Overloading Unary Operators – the general form of operator function for unary operators is as follows.public static return_type operator op (Type t){// Statements}Where Type must be a class or struct.The return type can be any type except void for unary operators like +,~, ! and dot (.). but the return type must be the type of ‘Type’ for ++and o remember that the true and false operators can be overloaded only as pairs. The compilation error occurs if a class declares one of these operators without declaring the other.

The following program overloads the unary – operator inside the class Complex

// Unary operator overloading
// Author: rajeshvs@msn.com

using System;

class Complex
private int x;
private int y;
public Complex()
public Complex(int i, int j)
x = i;
y = j;

public void ShowXY()
Console.WriteLine(\”{0} {1}\”,x,y);

public static Complex operator -(Complex c)
Complex temp = new Complex();
temp.x = -c.x;
temp.y = -c.y;
return temp;

class MyClient
public static void Main()
Complex c1 = new Complex(10,20);
c1.ShowXY(); // displays 10 & 20
Complex c2 = new Complex();
c2.ShowXY(); // displays 0 & 0
c2 = -c1;
c2.ShowXY(); // diapls -10 & -20

Overloading Binary Operators

An overloaded binary operator must take two arguments, at least one of them must be of the type class or struct, inwhich the operation is defined. But overloaded binary operators can return any value except the type void. The general form of a overloaded binary operator is as follows.Continues…

Pages: 1 2

Twitter Digg Delicious Stumbleupon Technorati Facebook Email

4 Responses to “C# Operator Overloading”

  1. It is very useful that person who wants to know more about any topic.

    Thanks a lot……………..

  2. Article should also mention how to override the behaviour of the indexing operator, i.e. [], which uses a different syntax based on property declarations:

    public int this [int index]
    set { /* do something with ‘value’ */ }
    get { /* return something */ }

  3. I just to add that the true operator or the false operator can’t be overloaded alone, you must overload both of them, therefore they can only be overloaded as pairs.

    Nice article…

  4. It might be helpful to mention that you can also overwrite cast-operators:

    // returns value for “(int)MyClassInstance”
    public static explicit operator int(MyClass instance)
    { return … }

    // for implicit casting do the following.
    // notice that this method will make “MyClass is int” true and “MyClassInstance as int” possible
    public static implicit operator int(MyClass instance)
    { return … }