如何比较泛型类型的值?
我将其简化为最小样本:
public class Foo<T> where T : IComparable
{
private T _minimumValue = default(T);
public bool IsInRange(T value)
{
return (value >= _minimumValue); // <-- Error here
}
}
错误是:
运算符'> ='不能应用于类型'T'和'T'的操作数。
到底怎么回事!?T
已被约束到IComparable
,甚至它限制值类型(的时候where T: struct
),我们仍然不能将任何运营商<
,>
,<=
,>=
,==
或!=
。(我知道涉及和的变通办法Equals()
存在,但对关系运算符没有帮助)。==
!=
因此,有两个问题:
- 为什么我们观察到这种奇怪的行为?是什么让我们从比较这是泛型类型的值称为是
IComparable
?难道不以某种方式破坏了通用约束的全部目的吗? - 我该如何解决这个问题,或者至少要解决它?
(我意识到已经有一些问题与这个看似简单的问题有关,但是没有一个线程给出详尽或可行的答案,所以在这里。)