我有一个通用类MyClass<T>
,其中T
仅是可以比较的类型。
这将仅表示已定义关系运算符的方法的数字类型和类。我该怎么做?
答案 0 :(得分:10)
您不能约束到运算符,但可以约束接口。因此,打算使用>=, <=, ==
,但您可以使用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
}
}
Equals
默认情况下,您会在object
上获得虚拟方法。如果要使用除引用相等之外的其他内容,则希望在自己的自定义类型上覆盖此方法。 (强烈建议同时覆盖GetHashCode
。)
答案 1 :(得分:3)
您可以使用where修饰符将泛型类型限制为仅实现IComparable接口的类。
public class MyClass<K> where K : IComparable
{
....
}
答案 2 :(得分:3)
如果您想将其限制为可以比较的内容,您可以执行以下操作:
public class MyClass<T> where T:IComparable
答案 3 :(得分:-1)
如果速度与使用建议的方法相关,将会给您带来巨大的性能损失。如果没有,所有建议的事情都可以正常工作。
这是我必须经常解决的问题,因为C#中的原始数据类型没有像其他人经常建议和要求的“数字”数据类型。
也许C#的下一个版本会有它,但我怀疑......