簡體   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