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