System.ValueTuple的排序顺序是否有官方规定,规定在哪里?

10
C# 7 中的新ValueTuple类型实现了IComparable,但我只能找到一份有关其实现的文档,其中仅说明CompareTo方法的返回值表示“排序中的相对位置”,但未说明所指的“排序顺序”具体是什么。
通过查看源代码,我发现它的排序顺序与我预期的相同 - 它将委托比较第一个字段及其默认的Comparer,然后按顺序逐个使用其他字段以解决平局。不过,在没有保证这一点不被视为可更改的实现细节的情况下,我不想依赖于此。
是否有文档明确记录了这种行为?

据我所知没有。唯一能说的是,System.ValueTuple 遵循与 System.Tuple 相同的约定,因此您可能希望查看是否有关于它的文档。 - Julien Couvreur
1
我认为这完全符合“没有其他解释合理”的直觉。 - Hans Passant
1个回答

8
根据源代码CompareTo调用默认比较器的Compare方法。
    public int CompareTo(ValueTuple<T1, T2, T3> other)
    {
        int c = Comparer<T1>.Default.Compare(Item1, other.Item1);
        if (c != 0) return c;

        c = Comparer<T2>.Default.Compare(Item2, other.Item2);
        if (c != 0) return c;

        return Comparer<T3>.Default.Compare(Item3, other.Item3);
    }

但您可以明确提供一个自定义的比较器。

int IStructuralComparable.CompareTo(object other, IComparer comparer)

1
源代码不是规范或文档,除非它在文档注释中。 - Douglas
2
@Douglas 在这种情况下,特别是当元组从一个 C# 版本发展到另一个版本时,这一点尤为重要。C# 6 规范刚刚完成,C# 7 规范正在进行中,而我们已经进入了 C# 7.2。 - Panagiotis Kanavos
@Douglas,我完全不同意。代码是文档的主要来源;它是唯一准确描述最终应用程序或库所做的事情的文档。而测试则是其应该执行的规范。其他所有内容都是补充说明,存在风险不同步,从而错误。 - David Arno
5
规范是一份文件,当我提交错误报告来支持我的声明源代码做错时,我可以指向它。代码无法成为这样的文件,因为它本质上无法与自己产生分歧。测试也不是这样的文件,因为它们不能涵盖每种情况或陈述支持有关它们未覆盖的案例的错误报告的一般原则。 - Douglas
2
@Douglas 这个说法在5年前确实是对于闭源项目而言的。然而,C#作为一个开源项目,一直在不断地发展。C# 6规范实际上还只是草案——并没有结束。你不需要规范就能提交一个bug——人们可以在chsarplang repo中随时报告语言问题,目前有696个未解决的问题。设计本身也是公开讨论的,讨论和决策都发布在repo上。 - Panagiotis Kanavos
@Douglas,我建议你查看我链接中的测试数量。任何人编写传统规范并比这些测试提供更详细信息的可能性都微乎其微。这些测试是将要产生的最详细的规范。正如Panagiotis所说,如果您需要提交错误报告,请在指出代码有误时指向测试。 - David Arno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接