如果调用 .Max()
IEnumerable<T>
上的扩展方法,并且其中的对象不实现 IComparable
, 一个得到 System.ArgumentException: At least one object must implement IComparable.
为什么不 Max
和类似的方法约束 T
实现IComparable
, 这样这个问题就可以在编译时而不是在运行时被捕获?
最佳答案
比较……很有趣。首先,您可以选择 IComparable<T>
或 IComparable
- 你会选择哪个?目前(通过 Comparer<T>.Default
)它支持两者,但没有“这个或那个”通用约束。
然后你得到Nullable<T>
的问题;这已经“提升”了比较,所以它是否具有可比性取决于 T
;但同样,Comparer<T>.Default
为我们处理这个问题( Nullable<T>
既没有实现 IComparable
也没有实现 IComparable<T>
)。
加上;它节省了通用约束传播;一旦你在库代码中有这样的约束,它就会迅速感染所有上游调用代码,使其成为一个艰难的过程。
关于c# - 为什么 IEnumerable<T>.Max 不将 T 约束为 IComparable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1176584/