【发布时间】:2018-08-23 10:49:24
【问题描述】:
示例(货币是枚举):
public struct MoneyQuantity: IComparable<MoneyQuantity>
{
public Currency Currency { get; }
public decimal Amount { get; }
public MoneyQuantity(Currency currency, decimal amount)
{
Currency = currency;
Amount = amount;
}
public int CompareTo(MoneyQuantity that)
=> Currency == that.Currency ?
Amount.CompareTo(that.Amount) :
throw new InvalidOperationException("Can't compare quantities of money in different currencies");
}
这可以接受吗?还是期望当一个类型是 IComparable 时,该类型的任何两个实例都应该是可比较的,并且如果客户端代码尝试比较它们,则不应抛出异常?
【问题讨论】:
-
我认为这段代码看起来不错,我认为问题是其他使用 MoneyQuantity 的开发人员是否期望一件事或另一件事。例如,如果我提供货币为欧元的 MoneyQuantity 和货币为美元的 MoneyQuantity,我是否被告知它会进行转换以比较它们?您提供了有关为什么它是无效操作的信息,因此这看起来完全合法并解释了我的情况。
-
您可以使货币具有可比性,例如,所有美元金额的比较小于所有英镑金额——显然,不同货币的两种金额不应该相等。问题是这样的事情对呼叫者是否有用。可以说,当他们得到一组无与伦比的货币,并试图进行比较时,已经出了问题。是抛出异常还是执行一些一致的比较更好取决于您的用例。例如,出于显示目的,任何排序都比没有好。
标签: c# .net exception icomparable