【问题标题】:Why does ValueTuple use non-standard IComparable implementation?为什么 ValueTuple 使用非标准的 IComparable 实现?
【发布时间】:2018-07-23 17:51:14
【问题描述】:

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

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

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

文档说IComparable表示可以排序,ValueTuple不是这样:

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

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

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

这个当前实例出现在排序中的相同位置 订单作为指定的对象 CompareTo 方法。

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

所以我的问题是:

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

【问题讨论】:

  • 这可能与您正在查看空的 ValueTuple 类型而不是其通用变体之一有关吗?
  • @BoltClock 是的,这可以解释。哎呀,没注意到!

标签: c# icomparable valuetuple


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 2015-04-03
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    相关资源
    最近更新 更多