我有泛型類型T的兩個對象泛型類型比較
T x , T y
我希望能夠做這樣的比較:
if (x >= y)
所以我嘗試使用compareTo
方法,缺少直到我添加約束where T:IComparable
。只有這樣我才能理解。
不知道爲什麼只有我看到它,而不是寫它之前。
我有泛型類型T的兩個對象泛型類型比較
T x , T y
我希望能夠做這樣的比較:
if (x >= y)
所以我嘗試使用compareTo
方法,缺少直到我添加約束where T:IComparable
。只有這樣我才能理解。
不知道爲什麼只有我看到它,而不是寫它之前。
不知道爲什麼只有我看到它,而不是在寫它之前。
因爲直到約束存在,則編譯器不知道的成員可在T
,比那些存在的object
部分其他。你不會指望能寫:
object x = GetObjectFromSomewhere();
object y = GetObjectFromSomewhere();
int comparison = x.CompareTo(y);
你會嗎? C#是靜態類型語言(除dynamic
之外) - 編譯器在使用它時必須知道您正在討論哪些成員。另外,如果你感興趣的類型實現IComparable<T>
而不是僅僅是非泛型的IComparable
,這將是一個更好的約束。它執行得更好(因爲它可以避免裝箱)並且它更安全(因爲它可以防止你試圖比較不相關的類型)。
偉大的答案,但如何寫作(X爲IComparable).compareTo比較與我們已經討論過的約束版本? – JavaSa
@JavaSa:該選項沒有編譯時類型安全性。哎呀,使用'as'代替轉換甚至會給你一個錯誤的錯誤('NullReferenceException'而不是更合理的'InvalidCastException')。我更喜歡使用泛型來增強編譯時類型的安全性。 –
爲什麼你希望在寫之前看到它? –
因爲該方法存在於該接口中,並且明確告訴編譯器您的泛型類型實現了該接口。 – Silvermind