c# - 限制 C# 中的泛型类型

标签 c# generics types

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

这意味着只有数字类型和类已经定义了关系运算符的方法。我该怎么做?

最佳答案

您不能约束到运算符,但可以约束到接口(interface)。因此,打算使用 >=, <=, ==已经出来了,但你可以使用 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。)

关于c# - 限制 C# 中的泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6890097/

相关文章:

c# - ConnectString 在 C# 中不起作用

java - 将 Class[] 转换为泛型?

java - Java 中的 ArrayList 内的 Arraylist 内的 Arraylist

kotlin - 当 T 为类型 "Nothing"时,通用参数需要类型 "Any"

scala - 如何从 scala TypeTag 获取通用简单类名?

.net - 返回 System.Nullable 的 int64 的 GetType

types - go中某个值的动态类型是什么意思?

c# - 为什么可以将 null 分配给 Nullable 变量?

c# - 将 XML 文件加载到数据表中(而不是从数据库中)

java - 指定任务可执行位置 "C:\Program Files (x86)\Java\jdk1.7.0_71\\bin\javac.exe"无效