Разрешение перегрузки (Visual Basic)

Когда компилятор Visual Basic сталкивается с вызовом процедуры, определенной в нескольких перегруженных версиях, компилятор должен решить, какие перегрузки следует вызывать. Для этого выполните следующие действия:

  1. "Специальные возможности Майкрософт". Она устраняет любую перегрузку с уровнем доступа, который предотвращает вызов кода.

  2. Количество параметров. Это устраняет любую перегрузку, которая определяет другое количество параметров, чем указано в вызове.

  3. Типы данных параметров. Компилятор предоставляет методы экземпляра по сравнению с методами расширения. Если обнаружен любой метод экземпляра, требующий только расширенных преобразований для сопоставления вызова процедуры, все методы расширения удаляются, а компилятор продолжает использовать только кандидаты методов экземпляра. Если такой метод экземпляра не найден, он продолжается как с методами экземпляра, так и с расширением.

    На этом шаге исключается любая перегрузка, для которой не удается преобразовать типы данных вызывающих аргументов в типы параметров, определенные в перегрузке.

  4. Сужение преобразований. Она устраняет любую перегрузку, требующую сужения преобразования из вызывающих типов аргументов в определенные типы параметров. Это верно, имеет ли тип параметр проверка ing (оператор 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). Затем она устраняет третью перегрузку, так как каждый тип аргумента во второй перегрузке (Short и Single) расширяется до соответствующего типа в третьей перегрузке (Integer и Single). Вторая перегрузка требует меньшего расширения, поэтому компилятор использует его для вызова.

Во втором вызове компилятор не может исключить какие-либо перегрузки на основе сужения. Она устраняет третью перегрузку по той же причине, что и при первом вызове, так как она может вызывать вторую перегрузку с меньшим расширением типов аргументов. Однако компилятор не может разрешать между первой и второй перегрузками. Каждый из них имеет один определенный тип параметра, который расширяется до соответствующего типа в другом (Byte до Short, но Single до Double). Поэтому компилятор создает ошибку разрешения перегрузки.

Перегруженные необязательные и аргументы ParamArray

Если две перегрузки процедуры имеют идентичные сигнатуры, за исключением того, что последний параметр объявлен необязательным в одной и ParamArray в другой, компилятор разрешает вызов этой процедуры следующим образом:

Если вызов предоставляет последний аргумент как Компилятор разрешает вызов перегрузки, объявляющей последний аргумент как
Нет значения (аргумент опущен) Optional
Одно значение Optional
Два или более значений в разделенном запятыми списке ParamArray
Массив любой длины (включая пустой массив) ParamArray

См. также