【发布时间】:2020-09-28 17:46:19
【问题描述】:
如何比较泛型类型的值?
我已将其缩减为最小样本:
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的泛型类型的值?它不是以某种方式破坏了通用约束的全部目的吗? - 我该如何解决这个问题,或者至少可以解决这个问题?
(我意识到已经有一些与这个看似简单的问题相关的问题 - 但没有一个线程给出详尽或可行的答案,所以在这里。)
【问题讨论】:
-
作为记录,这在 C# 10 中现在是可能的,因为接口现在可以包含静态方法(从而允许运算符重载)
标签: c# .net generics icomparable