오버로드 확인(Visual Basic)

Visual Basic 컴파일러가 여러 오버로드된 버전에 정의된 프로시저에 대한 호출을 발견하면 컴파일러는 호출할 오버로드를 결정해야 합니다. 다음 단계를 수행하여 이 작업을 수행합니다.

  1. 접근성. 호출 코드가 호출되지 않도록 하는 액세스 수준을 사용하여 오버로드를 제거합니다.

  2. 매개 변수 수. 호출에 제공된 것과 다른 수의 매개 변수를 정의하는 오버로드를 제거합니다.

  3. 매개 변수 데이터 형식. 컴파일러는 확장 메서드보다 인스턴스 메서드를 우선적으로 적용합니다. 프로시저 호출과 일치하도록 확대 변환만 필요한 인스턴스 메서드가 발견되면 모든 확장 메서드가 삭제되고 컴파일러는 인스턴스 메서드 후보만 사용하여 계속됩니다. 이러한 인스턴스 메서드를 찾을 수 없으면 인스턴스 및 확장 메서드를 모두 사용하여 계속됩니다.

    이 단계에서는 호출 인수의 데이터 형식을 오버로드에 정의된 매개 변수 형식으로 변환할 수 없는 오버로드를 제거합니다.

  4. 축소 변환. 호출 인수 형식에서 정의된 매개 변수 형식으로의 축소 변환이 필요한 오버로드를 제거합니다. 이는 형식 검사 스위치(Option Strict 문)가 On인지 또는 Off인지 여부에 관계없이 해당됩니다.

  5. 최소 확대. 컴파일러는 나머지 오버로드를 쌍으로 고려합니다. 각 쌍에 대해 정의된 매개 변수의 데이터 형식을 비교합니다. 오버로드 중 하나의 형식이 모두 다른 오버로드의 해당 형식으로 확장되면 컴파일러는 후자를 제거합니다. 즉, 최소의 확대만을 필요로 하는 오버로드를 유지합니다.

  6. 단일 후보. 하나의 오버로드만 남을 때까지 쌍으로 오버로드를 계속 고려하고 해당 오버로드에 대한 호출을 확인합니다. 컴파일러가 오버로드를 단일 후보로 줄일 수 없는 경우 오류가 발생합니다.

다음 그림에서는 오버로드된 버전 집합 중 호출할 버전을 결정하는 프로세스를 보여 줍니다.

Flow diagram of overload resolution process

다음 예제에서는 이 오버로드 확인 프로세스를 보여 줍니다.

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)의 형식으로 좁아지므로 컴파일러는 첫 번째 오버로드를 제거합니다. 그런 다음 두 번째 오버로드(ShortSingle)의 각 인수 형식이 세 번째 오버로드(IntegerSingle)의 해당 형식으로 확장되므로 세 번째 오버로드를 제거합니다. 두 번째 오버로드에는 확대가 덜 필요하므로 컴파일러는 이를 호출에 사용합니다.

두 번째 호출에서 컴파일러는 축소를 기반으로 오버로드를 제거할 수 없습니다. 인수 형식의 확대를 줄이면서 두 번째 오버로드를 호출할 수 있으므로 첫 번째 호출과 동일한 이유로 세 번째 오버로드를 제거합니다. 그러나 컴파일러는 첫 번째 오버로드와 두 번째 오버로드 사이를 확인할 수 없습니다. 각 매개 변수 형식에는 다른 해당 형식(Byte에서 Short로, Single에서 Double로)으로 확장되는 하나의 정의된 매개 변수 형식이 있습니다. 따라서 컴파일러는 오버로드 확인 오류를 생성합니다.

오버로드된 선택적 인수 및 ParamArray 인수

프로시저의 두 오버로드에 마지막 매개 변수가 하나에서는 선택적으로 선언되고 다른 하나에서는 ParamArray로 선언된다는 점을 제외하고 동일한 서명이 있는 경우 컴파일러는 다음과 같이 해당 프로시저에 대한 호출을 확인합니다.

호출이 마지막 인수를 다음과 같이 제공하는 경우 컴파일러는 마지막 인수를 다음과 같이 선언하는 오버로드에 대한 호출을 확인합니다.
값 없음(인수 생략) Optional
단일 값 Optional
쉼표로 구분된 목록의 두 개 이상의 값 ParamArray
모든 길이의 배열(빈 배열 포함) ParamArray

참고 항목