2017-10-18 92 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)是它應該做的規範。其他一切都是補充性的,風險不同步,因而是錯誤的。 –

相關問題