一尘不染

如何比较泛型类型的值?

c#

如何比较泛型类型的值?

我将其简化为最小样本:

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()存在,但对关系运算符没有帮助)。==``!=

因此,有两个问题:

  1. 为什么 我们观察到这种奇怪的行为?是什么让我们从比较这是泛型类型的值 称为IComparable?难道不以某种方式破坏了通用约束的全部目的吗?
  2. 我该如何解决这个问题,或者至少要解决它?

(我意识到已经有一些问题与这个看似简单的问题有关,但是没有一个线程给出详尽或可行的答案,所以在这里。)


阅读 329

收藏
2020-05-19

共1个答案

一尘不染

IComparable不会使>=运算符超载。你应该用

value.CompareTo(_minimumValue) >= 0
2020-05-19