Для ряда сущностей имеет смысл их представление в скалярном виде. Например, деньги состоят из количества и валюты, но при работе с ними зачастую нам нужно просто числовое представление, которое можно, в первую очередь, складывать с другими числами.
Допустим, у нас есть класс Money
со свойствами Amount
(количество) и Currency
(валюта), в которое реализовано неявное преобразование к decimal
и int
. Также перегружен оператор +
для сложения Money
с Money
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class Money { public decimal Amount { get; } public Currencies Currency { get; } ... public static implicit operator decimal(Money m) => m.Amount; public static implicit operator int(Money m) => (int)m.Amount; public static Money operator +(Money m1, Money m2) { var conv = m2.ConvertTo(m1.Currency); return new Money(m1.Amount + conv.Amount, m1.Currency); } ... } |
Это позволяет безо всяких приведений типов и выковыривания Amount
складывать Money
не только с Money
, но и с decimal
и int
. Результатом таких операций будет число decimal
или int
соответственно.
1 2 3 |
var m = new Money(100, Currencies.RUR); var x = 200; var sum = m + x; // (int)300 |