为什么ValueTuple使用非标准的IComparable实现?

时间:2018-02-13 11:12:10

标签: c# icomparable valuetuple

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

  

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

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

文档说IComparable表示可以对类型进行排序,ValueTuple不是这种情况:

  

此接口由可以对其值进行排序的类型实现   排序。它要求实现类型定义单个方法,   比较,这表明   排序顺序中当前实例的位置是否为   在相同类型的第二个对象之前,之后或相同之前。 (...)

     

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

     

小于零当前实例   在由...指定的对象之前   比较顺序中的CompareTo方法。

     

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

     

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

所以我的问题是:

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

1 个答案:

答案 0 :(得分:5)

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

将ValueTuple与null进行比较返回1的原因与将空字符串与null相同的原因返回1 - 因为您将某些内容与任何内容进行比较:)

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

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