7

ValueTuple.IComparable.CompareTo(Object)的文档说它返回:

如果 other 是 ValueTuple 实例,则为 0;否则,如果 other 为空,则为 1。

这使得IComparable实现看起来毫无用处,除了可能不会破坏可能期望实现接口的代码。较旧的参考Tuple类确实遵循标准实现(尽管它可能仅在项目支持时才有效IComparable)。

文档说IComparable表明可以对类型进行排序,但情况并非如此ValueTuple

此接口由其值可以排序或排序的类型实现。它要求实现类型定义一个方法,CompareTo,该方法指示当前实例在排序顺序中的位置是在相同类型的第二个对象之前、之后还是相同。(...)

CompareTo 方法的实现必须返回具有三个值之一的 Int32,如下表所示。

小于零当前实例在排序顺序中位于 CompareTo 方法指定的对象之前。

此当前实例出现在排序顺序中与 CompareTo 方法指定的对象相同的位置。

大于零此当前实例在排序顺序中遵循由 CompareTo 方法指定的对象。

所以我的问题是:

  • 为什么不像 Tuple 那样ValueTuple实现呢?CompareTo
  • 为什么IComparable即使它不支持有意义的排序,它也会实现?
4

1 回答 1

7

非泛型 ValueTuple 表示一个空元组。由于 ValueTuple 是一个结构,这意味着每个 ValueTuple 实例都是相等的,因此不需要对只包含空 ValueTuple 的集合进行排序。

将 ValueTuple 与 null 进行比较返回 1 的原因与将空字符串与 null 进行比较返回 1 的原因相同——因为您正在将某物与空物进行比较 :)

表示一个或多个元素的元组的 ValueTuple 的通用变体都IComparable.CompareTo()以您期望的方式实现。

请注意,元组本身是一个静态类,而它的所有泛型变体都表示非空元组。元组仅包含其非空变体的工厂方法。

于 2018-02-13T11:27:41.900 回答