繁体   English   中英

为什么不IEnumerable <T> .Max约束T是IC可比的吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM