限制c#中的泛型类型

本文关键字:泛型类型 限制 | 更新日期: 2023-09-27 18:04:18

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

这意味着只有定义了关系操作符方法的数字类型和类。我该怎么做呢?

限制c#中的泛型类型

您不能约束到操作符,但可以约束到接口。因此,打算使用>=, <=, ==是不可能的,但您可以使用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)

可以使用where修饰符将泛型类型限制为只能实现IComparable接口的类。

public class MyClass<K> where K : IComparable
{
  ....
}

如果您想将其限制为可以比较的内容,您可以这样做:

public class MyClass<T> where T:IComparable

如果速度是相关的,使用建议的方法将给您带来巨大的性能损失。如果没有,所有建议的事情都可以正常工作。

这是一个我必须经常解决的问题,因为c#中的基本数据类型不像这里其他人经常建议和要求的那样具有"数值"数据类型。

也许c#的下一个版本会有,但我怀疑…