2017-10-18 14 views
5

C# 7의 새로운 ValueTuple 유형은 IComparable을 구현하지만 이것의 구현에서 찾을 수있는 documentation은 단순히 CompareTo의 반환 값이 "정렬 순서대로"상대 위치를 나타냅니다. 실제로 "정렬 순서"가 무엇인지 언급하지 않습니다.System.ValueTuple의 정렬 순서가 공식적으로 지정 되었습니까?

소스를 조사하면 순서가 예상했던 것임을 알 수 있습니다. 첫 번째 필드를 기본값 인 Comparer과 비교 한 다음 다른 필드를 한 번에 하나씩 순서대로 사용하여 연결을 끊습니다. 그러나 사양을 위반하지 않고 변경 될 수있는 구현 세부 사항으로 간주되지 않는다는 보장이 없으면이를 사용하지 않는 것이 좋습니다.

이 동작은 실제로 어디에서 문서화되어 있습니까?

+0

하지에게 제공 할 수 있습니다. 내가 말할 수있는 유일한 것은'System.ValueTuple'은'System.Tuple'과 같은 규칙을 따르므로, 그 중 하나가 문서화되어 있는지 알고 싶을 수도 있습니다. –

+1

나는 이것이 "다른 것은 의미가 없다"직관적으로 적합하다고 생각합니다. –

답변

6

source code에 따르면, CompareTo 기본 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)는 수행해야 할 작업의 사양입니다. 다른 모든 것은 보완 적이며 동기가 맞지 않아 잘못된 것일 수 있습니다. –