【问题标题】:Generic types comparison泛型比较
【发布时间】:2014-05-19 17:01:23
【问题描述】:

我有两个泛型类型 T 的对象。

T x , T y

我希望能够像这样进行比较:

if (x >= y)

因此,我尝试使用 compareTo 方法,该方法在我添加约束 where T:IComparable 之前一直缺失。只有这样我才能在智能中看到它。

不知道为什么我才看到它,而不是在写它之前。

【问题讨论】:

  • 为什么要在写之前看到它?
  • 因为该方法存在于该接口中,并且您明确告诉编译器您的泛型类型实现了该接口。

标签: c# generics comparison


【解决方案1】:

不知道为什么我才看到它,而不是在写它之前。

因为在该约束存在之前,编译器不知道T 上可用的成员,除了那些作为object 的一部分存在的成员。你不会期望能够写:

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

你愿意吗? C# 是一种静态类型语言(dynamic 除外)- 编译器必须知道您在使用它们时所指的是哪些成员。

顺便说一句,如果您感兴趣的类型实现IComparable<T> 而不仅仅是非泛型IComparable,那将是一个更好的约束。它的性能更好(因为它可以避免装箱)并且更安全(因为它可以防止您尝试比较不相关的类型)。

【讨论】:

  • 很好的答案,但是与我们已经讨论过的约束版本相比,编写 (x as IComparable).compareTo 的选项如何?
  • @JavaSa:该选项没有编译时类型安全性。哎呀,使用as 而不是演员甚至会给你一个严重的错误(NullReferenceException 而不是更明智的InvalidCastException)。我更喜欢使用泛型来增强编译时类型的安全性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多