11.4.1 System.ValueTuple<…> 소개
C# 7의 튜플은 System.ValueTuple을 이용하는 일련의 타입들을 이용하여 구현되었다. 이 타입은 System.ValueTuple.dll 어셈블리에 포함되어 있는데, 이는 예전의 .NET Framework 배포본의 일부가 아니라 .NET Standard 2.0의 일부로 포함되어 있다. 따라서 예전의 .NET Framework를 사용해야 한다면 System.ValueTuple NuGet 패키지를 추가해야 튜플을 사용할 수 있다. 최신 .NET Framework를 사용한다면 System.ValueTuple을 사용하기 위해서 NuGet 패키지를 추가할 필요가 없다. 이 타입은 이제 System.Runtime.dll로 옮겨졌다.
System.ValueTuple은 타입 매개변수가 없는 것부터 여덟 개가 있는 것까지 총 아홉 개의 구조체가 존재한다.
• System.ValueTuple (제네릭이 아님)
• System.ValueTuple<T1>
• System.ValueTuple<T1, T2>
• System.ValueTuple<T1, T2, T3>
• System.ValueTuple<T1,T2, T3, T4>
• System.ValueTuple<T1, T2, T3, T4, T5>
• System.ValueTuple<T1, T2, T3, T4, T5, T6>
• System.ValueTuple<T1, T2, T3, T4, T5, T6, T7>
• System.ValueTuple<T1, T2, T3, T4, T5, T6, T7, TRest>
지금은 처음 두 개와 마지막 타입은 무시하기로 하자. 이에 대해서는 11.4.7절과 11.4.8절에서 좀 더 이야기할 것이다. 이제 애리티가 2부터 7인 타입만 남는다(이렇게 남겨진 타입들이 어쨌든 현실적으로 가장 많이 사용하는 타입들이다).
각각의 ValueTuple<…> 타입은 앞서 튜플 타입을 설명할 때 이야기한 내용과 거의 동일하다. 이 타입들은 Item1, Item2 등과 같이 이름 붙여진 public 필드를 가진 값 타입이며, 예외적으로 애리티가 8인 타입만 마지막 필드의 이름이 Rest이다.
C#에서 튜플 타입을 사용하면 이는 ValueTuple<…> 타입을 사용하는 것으로 매핑된다. 이러한 매핑 관계는 튜플 요소를 명명하지 않았을 때 매우 명확해 보인다. 즉, (int, string, byte)를 사용하면 ValueTuple<int, string, byte>로 매핑이 이루어진다. 그렇다면 튜플 요소에 이름을 명명한 C# 튜플 타입은 어떻게 될까? 제네릭 타입은 타입 매개변수만을 일반화한 것이므로 타입과 필드 이름까지 변경할 수는 없다. 컴파일러는 이를 어떻게 처리하는 것일까?