더북(TheBook)

ID 변환은 오버로드와 관련해서도 상당히 중요하다. 반환 타입만 다른 두 개의 오버로드는 한꺼번에 둘 수 없다. 즉, 다음과 같은 두 개의 메서드를 동일 클래스 내에 둘 수는 없다.

public void Method((int, int) tuple) {}
public void Method((int x, int y) tuple) {}

이 코드를 컴파일하면 다음과 같은 컴파일 오류가 발생한다.

error CS0111: 'Program' 형식은 동일한 매개 변수 형식을 가진 'Method' 멤버를 미리 정의합니다.

C#의 관점에서 보면 매개변수 타입이 완전히 동일하다고 할 수 없을지 모르겠지만, ID 변환의 관점에서 보자면 이 에러 메시지가 잘못되었다고 말할 수도 없다.

ID 변환을 정의하고 있는 공식 문서가 혼란스럽게 느껴진다면(공식적인 것은 아닐지라도) 다음과 같이 생각해 보는 것도 좋은 방법이다. 런타임 시에 두 타입을 서로 다르다고 할 수 없다면 둘은 동일한 것이다. 좀 더 자세한 내용은 11.4절에서 알아보자.

 

 

제네릭 변성 기능과 ID 변환은 함께 사용할 수 없음

ID 변환을 염두에 둔다면, 인터페이스나 델리게이트 타입에 대한 제네릭 변성 기능과 튜플 타입을 함께 사용할 수 없다. 제네릭 변성은 참조 타입에 대해서만 적용할 수 있는데, 튜플 타입은 항상 값 타입이기 때문이다. 예를 들어 다음 코드는 컴파일될 것처럼 보이지만 안타깝게도 그렇지 못하다.

IEnumerable<(string, string)> stringPairs = new (string, string)[10];
IEnumerable<(object, object)> objectPairs = stringPairs;

사실 실제로는 이러한 문제가 자주 나오지 않지만, 그럼에도 이 내용을 설명한 이유는 이러한 코드가 동작할 것이라 기대했다면 실망하지 않도록 미리 기대감을 없애주고 싶어서다.

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