2009-07-24 99 views
6

如果一個調用的IEnumerable<T>.Max()擴展方法,並在不實現IComparable的對象,一個得到System.ArgumentException: At least one object must implement IComparable.爲什麼不IEnumerable <T>。最大限制T是IComparable?

爲什麼不Max和類似的方法限制T實施IComparable,使這一問題可以被捕獲在編譯時而不是在運行時?

+0

在寫這個問題的時候,我想到了一個答案,但仍然認爲值得提問。 – 2009-07-24 09:29:56

回答

6

我想是因爲它更靈活。例如,您可能有一個包含字符串的IEnumerable<object>,在這種情況下Max()可以非常安全地調用,儘管類型Object未實現IComparable

+6

許多設計問題的一個難題是決定如何平衡強健系統的痛苦和繁瑣的要求,以及在運行時可能出現故障的靈活系統的痛苦。在這種特殊情況下,設計人員選擇靈活性強於魯棒性;這是否是正確的選擇當然是有爭議的,但必須做出一些選擇,這兩種選擇都不是完美的。 – 2009-07-24 16:12:31

+1

@Eric:+1,但我希望你發佈了一個答案,以便我可以接受它。 – 2009-11-06 16:04:00

8

比較是...樂趣。首先,您可以選擇IComparable<T>IComparable - 您會選擇哪一個?目前(通過Comparer<T>.Default)它同時支持,但不存在「此那個」通用約束。

然後你得到的問題Nullable<T>;這已經「取消」了比較,因此是否可比較取決於T;但再次爲我們處理(Nullable<T>既不實施IComparable也不IComparable<T>)。

加;它節省了通用約束傳播;只要你在庫​​代碼中有這樣的約束,它就會很快地感染所有的上游調用代碼,這使得它變得艱難。

相關問題