Dot-Net
C#中的運算符重載和Linq Sum
我有一個自定義類型 (
Money),它具有到十進制的隱式轉換和+. 當我有這些類型的列表並呼叫 linqSum方法時,結果是十進制的,而不是Money. 我怎樣才能讓+運營商主持並從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; } }
Sum只知道System.你可以
Aggregate這樣使用:Money result = list.Aggregate((x,y) => x + y);因為這是呼叫
Aggregate<Money>,它會使用你的Money.operator+並返回一個Money對象。