为什么没有IEnumerable <T> .Max约束T是IComparable?

Mat*_*lls 7 c# linq generics

如果一个人调用了一个.Max()扩展方法IEnumerable<T>,并且其中的对象没有实现IComparable,那么就得到了System.ArgumentException: At least one object must implement IComparable.

为什么不Max和类似的方法约束T实现IComparable,以便可以在编译时而不是在运行时捕获此问题?

Mar*_*ell 8

比较很有趣.首先,您可以选择IComparable<T>IComparable- 您会选择哪个?目前(via Comparer<T>.Default)它支持两者,但没有"this or that"通用约束.

然后你得到了问题Nullable<T>; 这已经"解除"了比较,所以它是否具有可比性取决于T; 但同样,Comparer<T>.Default为我们处理这个问题(Nullable<T>既不实现IComparable也不实现IComparable<T>).

加; 它节省了通用约束传播; 一旦你在库代码中有这样的约束,它就会迅速感染所有上游调用代码,使其成为一个艰难的过程.


Mat*_*lls 6

我想因为它更灵活.例如,您可能有一个IEnumerable<object>碰巧包含字符串的情况,在这种情况下Max()可以非常安全地调用它,尽管该类型Object没有实现IComparable.

  • 许多设计问题的一个困难方面是决定如何平衡强大系统的痛苦与对运行时可能失败的灵活系统的痛苦的繁重要求.在这种特殊情况下,设计师选择了灵活性而不是鲁棒性; 这是否是_right_选择肯定是有争议的,但必须做出一些选择,两种选择都不是完美的. (6认同)