ValueTuple.IComparable.CompareTo(Object)的文档说它返回:
0如果other是ValueTuple实例;否则,如果其他为空则为1。
这使得IComparable
实现看起来似乎毫无用处,除了可能没有破坏可能期望实现接口的代码。较早的引用Tuple
类确实遵循标准实现(尽管它可能仅在项目支持IComparable
时)才有效。
文档说IComparable
表示可以对类型进行排序,ValueTuple
不是这种情况:
此接口由可以对其值进行排序的类型实现 排序。它要求实现类型定义单个方法, 比较,这表明 排序顺序中当前实例的位置是否为 在相同类型的第二个对象之前,之后或相同之前。 (...)
CompareTo方法的实现必须 返回一个具有三个值之一的Int32,如图所示 在下表中。
小于零当前实例 在由...指定的对象之前 比较顺序中的CompareTo方法。
零此当前实例出现在排序中的相同位置 命令作为指定的对象 CompareTo方法。
大于 零此当前实例遵循由指定的对象 比较顺序中的CompareTo方法。
所以我的问题是:
ValueTuple
不像Tuple那样实现CompareTo
? IComparable
,即使它不支持有意义的排序?答案 0 :(得分:5)
非泛型ValueTuple表示空元组。由于ValueTuple是一个结构,这意味着每个ValueTuple实例都是相同的,因此不需要对空的ValueTuples进行排序。
将ValueTuple与null进行比较返回1的原因与将空字符串与null相同的原因返回1 - 因为您将某些内容与任何内容进行比较:)
表示一个或多个元素的元组的ValueTuple的泛型变体都以您期望的方式实现IComparable.CompareTo()
。
请注意,Tuple本身是一个静态类,而它的所有泛型变量都代表非空元组。元组只包含非空变体的工厂方法。