The principal arithmetic and comparison operators can be adapted for use by your own classes and structs. This is known as operator overloading.
Most operators have the form:
static <return type> operator <operator symbols>(<parameters>);
Cast operators have the form:
static (explicit|implicit) operator <cast-to-type>(<cast-from-type> <parameter name>);
Operators behave in the same way as static methods. An operator symbol takes the place of a method identifier, and they have parameters and a return type. The type rules for parameters and return type follow your intuition and you can rely on the compiler to provide detailed guidance.
You've been tempted back to Hyperia (with the high inflation) for an eye watering daily rate.
The Central Bank is contemplating introducing the US Dollar as a second currency so all the accounting systems have to be adapted to handle multiple currencies.
You have been asked to implement the currency amount object.
Please modify the CurrencyAmount
struct to handle equality. If the two currency amount structs do not have the same currency ("USD" or "HD") then an instance of ArgumentException
should be thrown.
CurrencyAmount amountA = new CurrencyAmount(55, "HD");
CurrencyAmount amountB = new CurrencyAmount(55, "HD");
CurrencyAmount amountC = new CurrencyAmount(55, "USD");
amountA == amountB
// => true
amountA != amountB
// => false
amountA == amountC
// => ArgumentException
amountA != amountC
// => ArgumentException
Please modify the CurrencyAmount
struct to handle comparisons (>
and <
, only). If the two currency amount structs do not have the same currency ("USD" or "HD") then an instance of ArgumentException
should be thrown.
CurrencyAmount amountA = new CurrencyAmount(55, "HD");
amountA > new CurrencyAmount(50, "HD")
// => true
amountA < new CurrencyAmount(50, "HD")
// => false
amountA > new CurrencyAmount(50, "USD")
// => ArgumentException
Please modify the CurrencyAmount
struct to handle arithmetic addition and subtraction (+
and -
, only). If the two currency amount structs do not have the same currency ("USD" or "HD") then an instance of ArgumentException
should be thrown.
CurrencyAmount amountA = new CurrencyAmount(55, "HD");
CurrencyAmount amountB = new CurrencyAmount(100, "HD");
CurrencyAmount amountC = new CurrencyAmount(55, "USD");
amountA + amountB
// => {155, HD}
amountB - amountA
// => {45, HD}
amountA + amountC
// => ArgumentException
Please modify the CurrencyAmount
struct to handle arithmetic multiplication and division (*
and /
, only).
CurrencyAmount amountA = new CurrencyAmount(10, "HD");
amountA * 2m
// => {20, HD}
amountA / 2m
// => {5, HD}
Please modify the CurrencyAmount
struct so that an instance can be explicitly cast to a double
.
CurrencyAmount amountA = new CurrencyAmount(55.5m, "HD");
(double)amountA
// => 55.5d
Please modify the CurrencyAmount
struct so that an instance can be implicitly converted to a decimal
.
CurrencyAmount amountA = new CurrencyAmount(55.5m, "HD");
decimal d = amountA;
// => d == 55.5m
Sign up to Exercism to learn and master C# with 62 concepts, 173 exercises, and real human mentoring, all for free.