int를 byte로 변환하는 암시적 타입 변환은 존재하지 않지만, 상수 5를 byte로 암시적 타입 변환하는 것은 가능하다(5가 byte로 나타낼 수 있는 값의 범위 내에 있기 때문에). 그리고 문자열 리터럴을 object로 암시적 타입 변환하는 것도 가능하다. 각각의 변환이 모두 유효하므로 전체 변환 또한 유효하다. 만세! 이번에는 다른 예를 보자.
(byte, string) tuple = (300, "text");
동일한 방법으로, 각각의 요소가 암시적 타입 변환이 가능한지 살펴보자.
▲ 그림 11-5 튜플 요소들에 대한 암시적 타입 변환이 불가능한 예
이 경우에는 상수 300을 byte로 변환할 수 있어야 한다. 하지만 300은 byte로 나타낼 수 있는 범위 내의 값이 아니므로 암시적 타입 변환을 할 수 없다. 암시적 타입 변환을 수행할 수는 있겠지만, 튜플 리터럴에 대해 전체적으로 암시적 타입 변환을 수행할 수 있어야 하므로 도움이 되지 않는다. 문자열 리터럴을 string 타입으로 암시적 타입 변환하는 것은 가능하다. 이 경우 모든 요소에 대해서 암시적 타입 변환을 수행할 수 없으므로 튜플 리터럴에 대한 암시적 변환은 유효하지 않다. 이 코드를 컴파일하면 튜플 리터럴 내의 300 때문에 다음과 같은 오류가 발생할 것이다.
error CS0029: 암시적으로 'int' 형식을 'byte' 형식으로 변환할 수 없습니다.
이 에러 메시지는 오해를 불러일으킨다. 이 오류에 따르면 이전 예제도 유효하지 않을 것이기 때문이다. 컴파일러는 사실상 int를 byte로 변환하려고 한 것이 아니라 300을 byte로 변환하려고 했을 따름이다.