如果一个调用的IEnumerable<T>
的.Max()
扩展方法,并在不实现IComparable
的对象,一个得到System.ArgumentException: At least one object must implement IComparable.
为什么不IEnumerable <T>。最大限制T是IComparable?
为什么不Max
和类似的方法限制T
实施IComparable
,使这一问题可以被捕获在编译时而不是在运行时?
如果一个调用的IEnumerable<T>
的.Max()
扩展方法,并在不实现IComparable
的对象,一个得到System.ArgumentException: At least one object must implement IComparable.
为什么不IEnumerable <T>。最大限制T是IComparable?
为什么不Max
和类似的方法限制T
实施IComparable
,使这一问题可以被捕获在编译时而不是在运行时?
我想是因为它更灵活。例如,您可能有一个包含字符串的IEnumerable<object>
,在这种情况下Max()
可以非常安全地调用,尽管类型Object
未实现IComparable
。
许多设计问题的一个难题是决定如何平衡强健系统的痛苦和繁琐的要求,以及在运行时可能出现故障的灵活系统的痛苦。在这种特殊情况下,设计人员选择灵活性强于鲁棒性;这是否是正确的选择当然是有争议的,但必须做出一些选择,这两种选择都不是完美的。 – 2009-07-24 16:12:31
@Eric:+1,但我希望你发布了一个答案,以便我可以接受它。 – 2009-11-06 16:04:00
比较是...乐趣。首先,您可以选择IComparable<T>
或IComparable
- 您会选择哪一个?目前(通过Comparer<T>.Default
)它同时支持,但不存在“此或那个”通用约束。
然后你得到的问题Nullable<T>
;这已经“取消”了比较,因此是否可比较取决于T
;但再次为我们处理(Nullable<T>
既不实施IComparable
也不IComparable<T>
)。
加;它节省了通用约束传播;只要你在库代码中有这样的约束,它就会很快地感染所有的上游调用代码,这使得它变得艰难。
在写这个问题的时候,我想到了一个答案,但仍然认为值得提问。 – 2009-07-24 09:29:56