如何比较泛型类型的值?

我已将其简化为最小样本:

public class Foo<T> where T : IComparable
{
    private T _minimumValue = default(T);

    public bool IsInRange(T value) 
    {
        return (value >= _minimumValue); // <-- Error here
    }
}

错误是:

Operator '>=' cannot be applied to operands of type 'T' and 'T'.

到底是什么!?T已经被约束为IComparable,即使将其约束为值类型(where T: struct),我们仍然不能应用任何运算符<><=>===!=.(我知道==!=存在涉及Equals()的变通方法,但对关系运算符没有帮助).

所以,有两个问题:

  1. Why我们观察到这种奇怪的行为了吗?是什么阻止我们比较泛型类型的值(knownIComparable)?它不是以某种方式挫败了泛型约束的全部目的吗?
  2. 我该如何解决这个问题,或者至少解决它?

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

推荐答案

IComparable不会使>=操作符超载.您应该使用

value.CompareTo(_minimumValue) >= 0

.net相关问答推荐

无法在Ubuntu 22.04.3上运行带有Rider 2023和DotNet-8.0的项目

升级到.NET8后,SignalR(在坞站容器上)网关损坏

Blazor服务器应用程序需要在页面上点击才能与元素交互

.NET 4.5 项目未在 Visual Studio 2022 中编译

代码访问安全是否在任何现实世界中使用?

如何使用 Moq 为不同的参数设置两次方法

.NET 中的线程安全集合

在 web api 控制器(.net 核心)中使用 async/await 或任务

C# 时间跨度毫秒与 TotalMilliseconds

使用 .NET 中的代码更改桌面墙纸

如何退出所有正在运行的线程?

.NET 中的对象引用有多大?

使用 C# 设置全局热键

将 Dictionary 转换为匿名对象?

MVC4 HTTP 错误 403.14 - 禁止

通过继承扩展枚举

System.IO.IOException:使用 System.IO.Path.GetTempFileName() 时文件存在 - 解决方案?

我可以将构造函数参数传递给 Unity 的 Resolve() 方法吗?

如何判断枚举是否包含数字?

没有科学记数法的双精度字符串转换