2017-10-18 60 views
5

C#7中的新ValueTuple类型实现IComparable,但我已经能够在其实现上找到这个唯一的documentation,只是表明CompareTo的返回值表示相对位置“按排序顺序”。它没有说明实际所指的“排序顺序”。是否正式指定了System.ValueTuple的排序顺序,以及在哪里?

通过检查来源,我可以发现订单是我期望的 - 它委托比较第一个字段的默认Comparer,然后逐个使用其他字段,以打破关系。但是,如果没有保证它不被视为可以在不违反规范的情况下更改的实现细节,我宁愿不依赖于此。

这种行为实际上在任何地方记录吗?

+0

据我所知。唯一可以说的是,System.ValueTuple遵循与System.Tuple相同的约定,所以你可能想看看是否有文档记录。 –

+1

我认为这符合“没有别的道理”直观。 –

回答

6

按照source codeCompareTo调用默认comparers

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); 
    } 

Compare方法,但你可以明确地向顾客提供比较器

int IStructuralComparable.CompareTo(object other, IComparer comparer) 
+0

源代码不是规范或文档,除非它在文档注释中。 – Douglas

+2

@Douglas在这种情况下,尤其是当元组从一个C#版本演化到下一个时。 C#6规范刚刚完成,C#7规范正在进行中,并且我们已经在C#7.2中已经完成 –

+0

@Douglas,完全不同意。代码是文档的主要来源;它是唯一精确描述由此产生的应用程序或库所做的文档。 [测试](https://github.com/dotnet/corefx/blob/master/src/System.ValueTuple/tests/ValueTupleTests.cs)是它应该做的规范。其他一切都是补充性的,风险不同步,因而是错误的。 –

相关问题