더북(TheBook)

동적 바인더는 (현재까지) 튜플 요소의 수가 상당히 많은 경우를 이해하지 못함

11.5.4절에서 살펴본 것처럼 튜플 요소가 일곱 개를 넘으면 컴파일러가 이를 담당한다. 컴파일러는 애리티가 8인 ValueTuple<…>을 이용하여 마지막 튜플 요소인 Rest(Item8이 아니라)가 다른 튜플을 포함하도록 한다. 컴파일러는 타입 자체를 바꿀 뿐 아니라 튜플 요소에 숫자를 이용하여 접근하는 코드에도 변경을 가한다. 예를 들어 tuple.Item9라고 코드를 작성하면 컴파일러는 tuple.Rest.Item2라고 IL 코드를 작성한다.

이 책을 쓸 당시, 동적 바인더는 이를 인식하지 못했다. 그래서 컴파일 타임 바인딩에는 문제가 없던 코드가 런타임에 예외를 일으킨다. 다음 코드를 살펴보자.

var tuple = (1, 2, 3, 4, 5, 6, 7, 8, 9);
Console.WriteLine(tuple.Item9);  ----- 올바르게 동작. tuple.Rest.Item2 형태로 컴파일됨
dynamic d = tuple;
Console.WriteLine(d.Item9);  ----- 런타임에 오류가 발생

하지만 이 문제는 이전 문제와 달리 런타임 바인더를 좀 더 스마트하게 개선하면 해결할 수 있는 문제다. 런타임 시의 동작 방식은 응용프로그램이 어떤 버전의 동적 바인더를 사용했는지에 달려 있다. 컴파일러의 버전과 어셈블리나 프레임워크의 버전은 서로 다르며, 각각을 구분할 수 있어야 한다. 더불어 특정 버전의 동적 바인더를 요구하는 형태로 코드를 작성하는 것은 적절하지 않다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.