Visual Basic 컴파일러는 프로시저가 여러 오버로드된 버전에서 정의될 때 호출할 오버로드를 결정해야 합니다. 다음 단계를 수행하여 결정합니다.
- 접근성. 호출 코드가 호출되지 않도록 하는 액세스 수준으로 오버로드를 제거합니다.
- 매개 변수 수입니다. 호출에 제공된 것과 다른 개수의 매개 변수를 정의하는 오버로드를 제거합니다.
- 매개 변수 데이터 형식입니다. 컴파일러는 확장 메서드보다 인스턴스 메서드 기본 설정을 제공합니다. 프로시저 호출과 일치하도록 확대 변환만 필요한 인스턴스 메서드가 있으면 모든 확장 메서드가 삭제됩니다. 컴파일러는 인스턴스 메서드 후보만 사용하여 계속됩니다. 이러한 인스턴스 메서드를 찾을 수 없으면 인스턴스 및 확장 메서드를 사용하여 계속됩니다. 이 단계에서는 호출 인수의 데이터 형식을 오버로드에 정의된 매개 변수 형식으로 변환할 수 없는 오버로드를 제거합니다.
- 축소 변환. 호출 인수 형식에서 정의된 매개 변수 형식으로의 축소 변환이 필요한 오버로드를 제거합니다. 이 단계는 형식 검사 스위치(Option Strict Statement)가
On
또는Off
여부에 관계없이 수행됩니다. - 최소 확대. 컴파일러는 나머지 오버로드를 쌍으로 고려합니다. 각 쌍에 대해 정의된 매개 변수의 데이터 형식을 비교합니다. 오버로드 중 하나의 형식이 모두 다른 오버로드의 해당 형식으로 확장되는 경우 컴파일러는 후자를 제거합니다. 즉, 최소 확대가 필요한 오버로드를 유지합니다.
- 오버로드 해결 우선순위 컴파일러는 후보 오버로드에서 가장 높은 값보다 OverloadResolutionPriorityAttribute 낮은 오버로드를 제거합니다. 이 특성이 없는 모든 오버로드에는 기본값 0이 할당됩니다.
- 단일 후보. 하나의 오버로드만 남을 때까지 쌍의 오버로드를 계속 고려하고 해당 오버로드에 대한 호출을 확인합니다. 컴파일러가 단일 후보에 대한 오버로드를 줄일 수 없으면 오류가 발생합니다.
다음 그림에서는 호출할 오버로드된 버전 집합을 결정하는 프로세스를 보여 줍니다.
다음 예제에서는 이 오버로드 확인 프로세스를 보여 줍니다.
Overloads Sub z(ByVal x As Byte, ByVal y As Double)
End Sub
Overloads Sub z(ByVal x As Short, ByVal y As Single)
End Sub
Overloads Sub z(ByVal x As Integer, ByVal y As Single)
End Sub
Dim r, s As Short
Call z(r, s)
Dim p As Byte, q As Short
' The following statement causes an overload resolution error.
Call z(p, q)
첫 번째 호출에서 컴파일러는 첫 번째 인수(Short
)의 형식이 해당 매개 변수(Byte
)의 형식으로 좁혀지므로 첫 번째 오버로드를 제거합니다. 그런 다음 두 번째 오버로드(Short
및 Single
)의 각 인수 형식이 세 번째 오버로드(Integer
및 Single
)의 해당 형식으로 확장되므로 세 번째 오버로드를 제거합니다. 두 번째 오버로드는 더 적은 확대가 필요하므로 컴파일러는 이를 호출에 사용합니다.
두 번째 호출에서 컴파일러는 축소를 기반으로 오버로드를 제거할 수 없습니다. 첫 번째 호출과 동일한 이유로 세 번째 오버로드를 제거합니다. 인수 형식의 확대를 줄이면서 두 번째 오버로드를 호출할 수 있기 때문입니다. 그러나 컴파일러는 첫 번째 오버로드와 두 번째 오버로드 간에 확인할 수 없습니다. 각 매개 변수 형식에는 다른 형식으로 확장되는 하나의 정의된 매개 변수 형식이 있으며, 하나는Byte
에서 Short
로, 다른 하나는 Single
에서 Double
로 확장됩니다. 따라서 컴파일러는 오버로드 확인 오류를 생성합니다.
오버로드된 Optional
및 ParamArray
인수
두 오버로드의 서명이 동일하고 마지막 매개변수가 한쪽에서는 Optional로 선언되었고 다른 쪽에서는 ParamArray로 선언된 경우, 컴파일러는 그 프로시저에 대한 호출을 다음과 같이 처리합니다.
호출이 마지막 인수를 다음과 같이 제공하는 경우 | 컴파일러는 마지막 인수를 다음과 같이 선언하는 오버로드에 대한 호출을 확인합니다. |
---|---|
값 없음(인수 생략) | Optional |
단일 값 | Optional |
쉼표로 구분된 목록의 두 개 이상의 값 | ParamArray |
모든 길이의 배열(빈 배열 포함) | ParamArray |
참조
.NET