Operator overload and Linq sum in C #

I have a custom type ( Money ) that has an implict conversion to decimal and overloaded operator for + . When I have a list of these types and the linq Sum method is called, the result will be decimal, not Money . How can I give operator + confirmation and return money from Sum ?

 internal class Test { void Example() { var list = new[] { new Money(10, "GBP"), new Money(20, "GBP") }; //this line fails to compile as there is not implicit //conversion from decimal to money Money result = list.Sum(x => x); } } public class Money { private Currency _currency; private string _iso3LetterCode; public decimal? Amount { get; set; } public Currency Currency { get { return _currency; } set { _iso3LetterCode = value.Iso3LetterCode; _currency = value; } } public Money(decimal? amount, string iso3LetterCurrencyCode) { Amount = amount; Currency = Currency.FromIso3LetterCode(iso3LetterCurrencyCode); } public static Money operator +(Money c1, Money c2) { if (c1.Currency != c2.Currency) throw new ArgumentException(string.Format("Cannot add mixed currencies {0} differs from {1}", c1.Currency, c2.Currency)); var value = c1.Amount + c2.Amount; return new Money(value, c1.Currency); } public static implicit operator decimal?(Money money) { return money.Amount; } public static implicit operator decimal(Money money) { return money.Amount ?? 0; } } 
+11
source share
1 answer

Sum only knows about number types in System .

You can use Aggregate as follows:

 Money result = list.Aggregate((x,y) => x + y); 

Since this is an Aggregate<Money> call, it will use your Money.operator+ and return a Money object.

+12
source

Source: https://habr.com/ru/post/949719/


All Articles