Для ряда сущностей имеет смысл их представление в скалярном виде. Например, деньги состоят из количества и валюты, но при работе с ними зачастую нам нужно просто числовое представление, которое можно, в первую очередь, складывать с другими числами.
Допустим, у нас есть класс 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 |