모양새가 예쁘다고 할 수는 없지만 최소한 기능적으로는 문제가 없다. 대부분의 경우에 적용할 수 있는 좀 더 간단한 대안은 튜플 내의 요소별로 적당한 타입으로 각기 타입 변환하는 것이다. 이렇게 하면 튜플을 원하는 타입으로 변환할 수도 있고, 리터럴에서 자동으로 추론된 타입을 그대로 쓸 수도 있다. 예를 들어 앞의 코드는 다음과 같이 바꿔 쓸 수 있다.
int x = 300;
var tuple = ((byte) x, "text");
두 방식은 완전히 동일하게 동작한다. 튜플 리터럴에 타입 변환을 적용하더라도 컴파일러는 튜플의 요소별로 명시적 타입 변환을 수행하는 코드를 생성한다. 하지만 두 가지 예제 중 두 번째 방법이 좀 더 가독성이 좋다. 무엇보다도 의도가 좀 더 명확히 드러난다. 앞의 경우 int를 byte로 명시적 타입 변환을 수행하고 문자열은 그대로 두려는 의도가 명확히 드러난다. 여러 개의 타입을 특정 튜플 타입으로 변환하려면 튜플 전체를 한 번에 명시적 타입 변환하는 것보다 요소별로 명시적 타입 변환을 수행하는 편이 나은데, 타입 변환으로 인해 기존의 값이 손상될 가능성을 가시적으로 드러내는 효과가 있기 때문이다.
튜플 리터럴의 타입 변환에서 요소별로 명명된 이름의 역할
이번 절에서는 요소별로 명명된 이름에 관해 전혀 언급하지 않았다. 사실 튜플 리터럴의 변환 과정은 요소별 이름과는 전혀 상관이 없다. 가장 중요한 부분은 요소의 이름을 명명하지 않은 튜플을 요소의 이름을 명명한 튜플로 변환하더라도 아무런 문제가 없다는 점이다. 실제로 이 장에서는 아무런 문제 없이 이 같은 코드를 여러 번 사용했다. 첫 번째 MinMax 메서드의 구현부도 마찬가지인데, 이 메서드의 원형은 다음과 같다.
static (int min, int max) MinMax(IEnumerable<int> source)