Implicit operator overloading


An implicit keyword is used to declare an implicit user-defined type conversion operator. In other word, this gives a power to your C# class, which can accepts any reasonably convertible data type without type casting. And such kind of class can also be assigned to any convertible object or variable. If you want to create implicit operator function, here is a signature of creating them in C#.
«access specifier» static implicit operator «converting type» («convertible type» rhs)
Above signature states that operator accepts «convertible type» and converts into «converting type».

Following code shows you how to create them.

/// <summary>

/// Creates Currency object from string supplied as currency sign.

/// </summary>

/// <param name="rhs">The currency sign like $,£,¥,€,Rs etc. </param>

/// <returns>Returns new Currency object.</returns>

public static implicit operator Currency(string rhs)

{

    Currency c = new Currency(0, rhs); //Internally call Currency constructor

return c;

}

/// <summary>

/// Creates a currency object from decimal value.

/// </summary>

/// <param name="rhs">The currency value in decimal.</param>

/// <returns>Returns new Currency object.</returns>

public static implicit operator Currency(decimal rhs)

{

Currency c = new Currency(rhs, NumberFormatInfo.CurrentInfo.CurrencySymbol);

return c;

}

/// <summary>

/// Creates a decimal value from Currency object,

/// used to assign currency to decimal.

/// </summary>

/// <param name="rhs">The Currency object.</param>

/// <returns>Returns decimal value of the currency</returns>

public static implicit operator decimal(Currency rhs)

{    return rhs.Value;

}

/// <summary>

/// Creates a long value from Currency object, used to assign currency to long.

/// </summary>

/// <param name="rhs">The Currency object.</param>

/// <returns>Returns long value of the currency</returns>

public static implicit operator long(Currency rhs)

{    return (long)rhs.Value;

}

Behind the scene

Such kind of implicit operator overloading is not supported by all languages, then how does csharp incorporate such a nice feature. The answer lies in an assembly code generated by the csharp compiler. Following table shows the C# syntax with corresponding IL syntax.

C# declaration

IL Declaration

public static implicit operator Currency(decimal rhs)

.method public hidebysig specialname static
class Currency op_Implicit(valuetype [mscorlib]System.Decimal rhs) cil managed

public static implicit operator decimal(Currency rhs)

.method public hidebysig specialname static
valuetype [mscorlib]System.Decimal op_Implicit(class Currency rhs) cil managed

IL syntax in above table makes it clear that C# compiler generates op_Implicit function which returns «converting type» and accepts «converting type».

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Powered by WordPress.com.

Up ↑

%d bloggers like this: