[英]Why doesn't IEnumerable<T>.Max constrain T to be IComparable?
如果在IEnumerable<T>
上调用.Max()
扩展方法,并且其中的对象不实现IComparable
,则会获得System.ArgumentException: At least one object must implement IComparable.
为什么Max
和类似方法没有约束T
来实现IComparable
,所以这个问题可以在编译时而不是在运行时捕获?
比较很有趣。 首先,您可以选择IComparable<T>
或IComparable
- 您会选择哪个? 目前(通过Comparer<T>.Default
)它支持两者,但没有“this 或 that”通用约束。
然后你得到Nullable<T>
的问题; 这已经“解除”了比较,所以它是否具有可比性取决于T
; 但同样, Comparer<T>.Default
为我们处理了这个问题( Nullable<T>
既不实现IComparable
也不实现IComparable<T>
)。
加; 它节省了通用约束传播; 一旦你在库代码中有这样的约束,它就会迅速感染所有上游调用代码,使其成为一个艰难的过程。
我想因为它更灵活。 例如,您可能有一个碰巧包含字符串的IEnumerable<object>
,在这种情况下,可以非常安全地调用Max()
,尽管Object
类型没有实现IComparable
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.