如果在 .Max() 上调用 IEnumerable<T> 扩展方法,并且其中的对象没有实现 IComparable ,则获得 System.ArgumentException: At least one object must implement IComparable.
为什么不 Max 和类似的方法约束 T 来实现 IComparable ,以便可以在编译时而不是在运行时捕获这个问题?

最佳答案

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

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

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

关于c# - 为什么 IEnumerable<T>.Max 不将 T 约束为 IComparable?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1176584/

10-13 06:23