Dot-Net

C#中的運算符重載和Linq Sum

  • December 1, 2012

我有一個自定義類型 ( 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對象。

引用自:https://stackoverflow.com/questions/13661335