必须实现一个小于和大于一般的操作
我绝对不能硬编码数据类型。 我需要严格的数据输入。 我必须使用TValue a <= TValue b。 再一次,绝对没有办法做某事像(双)a。 这是基本库实现的一部分。 关于泛型值的唯一具体事情是它们是静态类型。 IComparable和其他接口似乎不起作用。
为什么IComparable不能为您服务?
您可能无法获得使用“<”和“>”符号的语法糖,但您可以检查CompareTo的结果是否小于或大于0,这将为您提供相同的信息。
您甚至可以编写一个很好的扩展方法,以便更容易使用。
static void Main(string[] args) { Console.WriteLine(1.IsGreaterThan(2)); Console.WriteLine(1.IsLessThan(2)); } public static bool IsGreaterThan(this T value, T other) where T : IComparable { return value.CompareTo(other) > 0; } public static bool IsLessThan (this T value, T other) where T : IComparable { return value.CompareTo(other) < 0; }
只需使用System.Collections.Generic.Comparer
– 并查找负,正和0返回值。
它支持IComparable
和IComparable
,适用于类,结构和Nullable
-of-structs。
您可以更精确地使用您的数据类型和用例吗?
毕竟,要实现比较操作,您需要有关该类的某些信息; 一个完全通用的实现通常不具备比较两个对象所需的信息 – 除非你想在GetHashCode()或ToString()上对它们进行排序,这是一件很奇怪的事情。
有各种用于类型安全比较的通用接口:
- 对象本身的
IComparable
-
IComparer
作为外部比较实现。
如果您在类型上实现了IComparable
或IComparable
,那么您可以使用Comparer
自动获取后一种变体 – 这使得比较消费者的写入时间更短,并且是通用约束的替代方案要求类型为IComparable
。