명시적 변환
튜플 리터럴에 대한 명시적 변환은 암시적 변환과 동일한 규칙을 따른다. 다만, 튜플 리터럴 내의 표현식이 그에 대응하는 요소의 타입으로 명시적 변환할 수 있어야 한다는 점에 차이가 있다. 만약 이러한 조건이 모두 부합한다면, 튜플 리터럴을 튜플 타입으로 명시적 변환할 수 있다. 즉, 타입 변환 작업을 일반적인 방법으로 수행할 수 있다.
TIP ≡
C#에서는 조금 혼돈스러운 면이 있지만, 모든 암시적 변환은 명시적 변환의 일부로 간주된다. 그러므로 이 조건을 좀 더 명확히 하면, ‘각 튜플 내의 각 요소에 명시적 또는 암시적 변환이 가능해야 한다’고 말할 수 있다.
(300, "text") 예로 돌아가 보자. 이 경우에 (byte, string) 튜플 타입으로 명시적 변환을 수행할 수 있다. 하지만 300이라는 상수는 byte로 표현할 수 있는 값의 범위를 벗어난다는 사실을 컴파일러가 이미 알고 있으므로 컴파일 과정에서 값의 유효성을 평가하지 않도록 코드를 수정할 필요가 있다.
int x = 300;
var tuple = ((byte, string)) (x, "text");
캐스팅 부분인 ((byte, string))은 불필요한 괄호가 있는 듯 보이지만 사실 모두 필요하다. 내부 괄호는 튜플 타입임을 나타내는 것이며, 외부 괄호는 타입 변환을 의미한다. 그림 11-6에 이를 나타냈다.
▲ 그림 11-6 명시적 튜플 변환