13.3.3 in 매개변수의 오버로딩
지금까지 메서드의 오버로딩은 다루지 않았다. 메서드의 이름이 동일하고 매개변수의 타입마저도 완전히 동일한 두 메서드가 있고, 그중 하나의 메서드가 in 매개변수를 취하도록 선언되어 있다고 가정해 보자. 이 경우 나머지 하나의 메서드는 어떤 형태로 한정자를 지정해야 오버로딩이 가능할까?
CLR 관점에서 생각해 본다면 in 한정자는 또 다른 참조 매개변수에 지나지 않는다. 따라서 ref, out, in 따위의 한정자만을 사용해서는 오버로딩을 선언할 수 없다. 하지만 in 매개변수와 일반적인 값 매개변수는 완전히 다른 것으로 간주되기 때문에 값 매개변수를 취하는 메서드로는 오버로딩을 선언할 수 있다.
void Method(int x) { ... }
void Method(in int x) { ... }
오버로드 해석 시에 사용되는 우선순위 결정 규칙은 호출 시 전달하는 인수에 in 한정자가 명시적으로 지정되지 않았을 경우 값 매개변수를 취하는 메서드를 우선적으로 찾는다는 것이다.
int x = 5;
Method(5); ----- 첫 번째 Method 호출
Method(x); ----- 첫 번째 Method 호출
Method(in x); ----- in 한정자가 사용되었으므로 두 번째 Method 호출
규칙을 이와 같이 정한 덕분에 기존 메서드가 값 매개변수를 취하는 경우라면, 특별히 호환성 문제를 걱정하지 않고도 in 매개변수를 취하는 동일한 이름의 오버로드를 손쉽게 추가할 수 있다.