2014-05-19 221 views
0

我有泛型類型T的兩個對象泛型類型比較

T x , T y 

我希望能夠做這樣的比較:

if (x >= y) 

所以我嘗試使用compareTo方法,缺少直到我添加約束where T:IComparable。只有這樣我才能理解。

不知道爲什麼只有我看到它,而不是寫它之前。

+1

爲什麼你希望在寫之前看到它? –

+0

因爲該方法存在於該接口中,並且明確告訴編譯器您的泛型類型實現了該接口。 – Silvermind

回答

8

不知道爲什麼只有我看到它,而不是在寫它之前。

因爲直到約束存在,則編譯器不知道的成員可在T,比那些存在的object部分其他。你不會指望能寫:

object x = GetObjectFromSomewhere(); 
object y = GetObjectFromSomewhere(); 
int comparison = x.CompareTo(y); 

你會嗎? C#是靜態類型語言(除dynamic之外) - 編譯器在使用它時必須知道您正在討論哪些成員。另外,如果你感興趣的類型實現IComparable<T>而不是僅僅是非泛型的IComparable,這將是一個更好的約束。它執行得更好(因爲它可以避免裝箱)並且它更安全(因爲它可以防止你試圖比較不相關的類型)。

+0

偉大的答案,但如何寫作(X爲IComparable).compareTo比較與我們已經討論過的約束版本? – JavaSa

+3

@JavaSa:該選項沒有編譯時類型安全性。哎呀,使用'as'代替轉換甚至會給你一個錯誤的錯誤('NullReferenceException'而不是更合理的'InvalidCastException')。我更喜歡使用泛型來增強編譯時類型的安全性。 –