我有泛型类型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