我有一个通用类 MyClass<T>
,其中T
应该仅限于可比较的类型。
这意味着仅数字类型和定义了关系运算符方法的类。我该如何实现?
你不能将约束限制在运算符上,但是可以将其限制在接口上。因此,想要使用 >=, <=, ==
是不行的,但是你可以使用 CompareTo, Equals
。
where T : IComparable<T>
该接口提供了CompareTo
方法,用于关系排序(大于、小于等)。原始类型和字符串已经实现了这个方法,但对于自定义类型,您需要自己实现。使用方法如下:
void SomeMethod<T>(T alpha, T beta) where T : IComparable<T>
{
if (alpha.CompareTo(beta) > 0)
{
// alpha is greater than beta, replaces alpha > beta
}
else if (alpha.CompareTo(beta) < 0)
{
// alpha is less than beta, replaces alpha < beta
}
else
{
// CompareTo returns 0, alpha equals beta
}
}
< p > Equals
是默认作为 object
上的虚方法提供的。如果您想使用除引用相等性以外的其他内容,则需要在自己的自定义类型上重写此方法。(强烈建议同时重写 GetHashCode
)
public class MyClass<K> where K : IComparable
{
....
}
public class MyClass<T> where T:IComparable
Equals
默认是对象上的虚方法,所以我在答案中没有提到接口。为了更清晰,我会进行更新。 - Anthony Pegramoperator < cannot not be applied to T and T
。我是否需要实现 CompareTo() 方法?我认为编译器应该能够根据类型自动解决这个问题。 - rohit89CompareTo
方法,该方法已经适用于int、string、double等类型。如果您的类也要使用通用方法/类,则需要自己实现接口。 - Anthony Pegramint
的类转换为通用类。有多个地方使用了关系运算符进行比较。我该如何处理这些行? - rohit89