通用类型比较

Jav*_*aSa 0 c# generics comparison

我有两个通用类型T的对象.

T x , T y
Run Code Online (Sandbox Code Playgroud)

我想能够做比较,如:

if (x >= y)
Run Code Online (Sandbox Code Playgroud)

因此,我尝试使用compareTo缺少的方法,直到我添加约束where T:IComparable.只有这样才能在智慧中看到它.

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

Jon*_*eet 8

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

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

object x = GetObjectFromSomewhere();
object y = GetObjectFromSomewhere();
int comparison = x.CompareTo(y);
Run Code Online (Sandbox Code Playgroud)

你会?C#是一种静态类型语言(除了dynamic) - 编译器必须知道你在使用它们时谈论的是哪些成员.

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

  • @JavaSa:该选项没有编译时类型安全性.哎呀,使用`as`而不是强制转换甚至会给你一个错误的错误(`NullReferenceException`而不是更明智的`InvalidCastException`).我更喜欢使用泛型来增强编译时类型的安全性. (3认同)