12.1.3 튜플 리터럴의 분해에 대한 세부 사항
11.3.1절에서 이야기한 바와 같이 모든 튜플 리터럴이 항상 타입을 가지는 것은 아니다. 예를 들어 (null, x => x * 2)라는 튜플은 튜플 요소를 나타내는 표현식이 타입을 가지지 않으므로 튜플 자체도 타입을 가질 수 없다. 하지만 이 튜플의 모습을 살폈을 때 적절한 타입으로 변환을 수행하면 (string, Func<int, int>)로 변환할 수 있다.
여기서 한 가지 좋은 소식은 튜플 분해 과정이 ‘튜플 요소별 할당 호환성’에 근간하여 수행된다는 것이다. 이는 분해 과정에서 선언이 이루어지든 할당이 이루어지든 상관없이 동일하게 수행된다. 다음에 간단한 예를 나타냈다.
(string text, Func<int, int> func) =
(null, x => x * 2); ----- text와 func를 선언
(text, func) = ("text", x => x * 3); ----- text와 func에 할당
그리고 분해 과정 중에 필요하다면 표현식을 대상 타입으로 변환하기 위해서 암시적인 변환이 수행된다. 앞서 자주 등장한 ‘byte로 표현 가능한 범위 내에 있는 int 값’을 예로 들면 다음과 같이 코드를 작성할 수 있다.
(byte x, byte y) = (5, 10);
수많은 뛰어난 언어 기능과 마찬가지로 이 기능 또한 우리가 세부적인 내용을 알지 못하더라도 예상 가능한 수준으로 동작한다. 하지만 언어를 설계할 때는 매우 신중하게 설계하고 구체적으로 이를 허용해 주어야 한다. 지금까지 튜플을 분해하는 것을 상당히 자세히 살펴봤다. 다음으로 튜플이 아닌 타입에 대한 분해를 살펴볼 텐데, 이 내용은 그리 복잡하지 않다.