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;
}
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.