【发布时间】:2017-06-11 10:28:38
【问题描述】:
首先我按照本教程创建了我的 Money 对象:https://www.codeproject.com/articles/837791/money-pattern
Money totalItems = _invoice.InvoiceDetails
.Sum(y => y.Amount); // Amount is of type Money
我在y.Amount 上遇到编译异常:
不能隐式转换类型 '钱' 到' 多头?不能 将 lambda 表达式转换为预期的委托类型,因为一些 块中的返回类型不能隐式转换为 委托返回类型
我做错了什么?
这是我的 Money 课程:
public class Money
{
public decimal Amount { get; private set; }
public CurrencyCode Currency { get; private set; }
#region Constructors
public Money() { }
public Money(Money amount)
{
this.Amount = amount.Amount;
this.Currency = amount.Currency;
}
public Money(decimal amount, CurrencyCode currencyCode)
{
this.Amount = amount;
this.Currency = currencyCode;
}
public Money(int amount, CurrencyCode currency)
: this(Convert.ToDecimal(amount), currency)
{
}
public Money(double amount, CurrencyCode currency)
: this(Convert.ToDecimal(amount), currency)
{
}
#endregion
#region Comprasion operators
public static bool operator ==(Money var1, Money var2)
{
if ((object)var1 == null || (object)var2 == null)
return false;
if (var1.Currency != var2.Currency) return false;
return var1.Amount == var2.Amount;
}
public static bool operator !=(Money var1, Money var2)
{
return !(var1 == var2);
}
public static bool operator >(Money var1, Money var2)
{
if (var1.Currency != var2.Currency)
throw new InvalidOperationException("Comprasion between different currencies is not allowed.");
return var1.Amount > var2.Amount;
}
public static bool operator <(Money var1, Money var2)
{
if (var1 == var2) return false;
return !(var1 > var2);
}
public static bool operator <=(Money var1, Money var2)
{
if (var1 < var2 || var1 == var2) return true;
return false;
}
public static bool operator >=(Money var1, Money var2)
{
if (var1 > var2 || var1 == var2) return true;
return false;
}
#endregion
#region Ariphmetical operations
public static Money operator +(Money var1, Money var2)
{
if (var1.Currency != var2.Currency)
{
throw new InvalidCastException("Calculation is using different currencies!");
}
return new Money(var1.Amount + var2.Amount, var1.Currency);
}
public static Money operator -(Money var1, Money var2)
{
if (var1.Currency != var2.Currency)
{
throw new InvalidCastException("Calculation is using different currencies!");
}
return new Money(var1.Amount - var2.Amount, var1.Currency);
}
public static Money operator *(Money var1, Money var2)
{
if (var1.Currency != var2.Currency)
{
throw new InvalidCastException("Calculation is using different currencies!");
}
return new Money(var1.Amount * var2.Amount, var1.Currency);
}
public static Money operator /(Money var1, Money var2)
{
if (var1.Currency != var2.Currency)
{
throw new InvalidCastException("Calculation is using different currencies!");
}
return new Money(var1.Amount / var2.Amount, var1.Currency);
}
public static Money operator *(decimal var1, Money var2)
{
return new Money(var1 * var2.Amount, var2.Currency);
}
public static Money operator *(Money var1, decimal var2)
{
return new Money(var1.Amount * var2, var1.Currency);
}
public static Money operator /(decimal var1, Money var2)
{
return new Money(var1 / var2.Amount, var2.Currency);
}
public static Money operator /(Money var1, decimal var2)
{
return new Money(var1.Amount / var2, var1.Currency);
}
public static Money operator *(int var1, Money var2)
{
return new Money(var1 * var2.Amount, var2.Currency);
}
public static Money operator *(Money var1, int var2)
{
return new Money(var1.Amount * var2, var1.Currency);
}
public static Money operator /(int var1, Money var2)
{
return new Money(var1 / var2.Amount, var2.Currency);
}
public static Money operator /(Money var1, int var2)
{
return new Money(var1.Amount / var2, var1.Currency);
}
public static Money operator *(long var1, Money var2)
{
return new Money(var1 * var2.Amount, var2.Currency);
}
public static Money operator *(Money var1, long var2)
{
return new Money(var1.Amount * var2, var1.Currency);
}
public static Money operator /(long var1, Money var2)
{
return new Money(var1 / var2.Amount, var2.Currency);
}
public static Money operator /(Money var1, long var2)
{
return new Money(var1.Amount / var2, var1.Currency);
}
#endregion
public override bool Equals(object obj)
{
if (obj == null) return false;
Money money = obj as Money;
return (this.Amount == money.Amount && this.Currency == money.Currency);
}
public bool Equals(Money money)
{
if ((object)money == null) return false;
return (this.Amount == money.Amount && this.Currency == money.Currency);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
public override string ToString()
{
return this.Amount.ToString();
}
#endregion
【问题讨论】:
-
试试 y.Amount.Amount?
-
@shole 真的吗?当然可以,但我失去了 Money 课程的所有好处。
-
好的,我错过了你问题的全部要点,你试图覆盖操作员并让 LINQ 直接对 Money(y.Amount is Money...这很混乱!!) 进行求和。 ...也许这篇文章可以帮助你一点? stackoverflow.com/questions/17717858/linq-sum-on-objects
-
我怀疑您能否成功指导 Linq 提供者如何将此类表达式转换为 SQL。虽然像 Money 这样的自定义类是完全可以接受的,但它们应该出现在 BAL 的上一层,而不是 DAL。