限制C#中的泛型类型

时间:2011-07-31 14:45:46

标签: c# generics types

我有一个通用类MyClass<T>,其中T 是可以比较的类型。

这将仅表示已定义关系运算符的方法的数字类型和类。我该怎么做?

4 个答案:

答案 0 :(得分:10)

您不能约束到运算符,但可以约束接口。因此,打算使用>=, <=, ==,但您可以使用CompareTo, Equals

where T : IComparable<T>

Interface documentation

此界面为您提供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#的下一个版本会有它,但我怀疑......

相关问题