2014-05-19 160 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')。我更喜欢使用泛型来增强编译时类型的安全性。 –