Разрешение перегрузки (Visual Basic)
Когда компилятор Visual Basic сталкивается с вызовом процедуры, определенной в нескольких перегруженных версиях, компилятор должен решить, какие перегрузки следует вызывать. Для этого выполните следующие действия:
"Специальные возможности Майкрософт". Она устраняет любую перегрузку с уровнем доступа, который предотвращает вызов кода.
Количество параметров. Это устраняет любую перегрузку, которая определяет другое количество параметров, чем указано в вызове.
Типы данных параметров. Компилятор предоставляет методы экземпляра по сравнению с методами расширения. Если обнаружен любой метод экземпляра, требующий только расширенных преобразований для сопоставления вызова процедуры, все методы расширения удаляются, а компилятор продолжает использовать только кандидаты методов экземпляра. Если такой метод экземпляра не найден, он продолжается как с методами экземпляра, так и с расширением.
На этом шаге исключается любая перегрузка, для которой не удается преобразовать типы данных вызывающих аргументов в типы параметров, определенные в перегрузке.
Сужение преобразований. Она устраняет любую перегрузку, требующую сужения преобразования из вызывающих типов аргументов в определенные типы параметров. Это верно, имеет ли тип параметр проверка ing (оператор Option Strict)
On
илиOff
.Наименьшее расширение. Компилятор рассматривает оставшиеся перегрузки в парах. Для каждой пары сравниваются типы данных определенных параметров. Если типы в одном из перегрузок расширяются до соответствующих типов в другом, компилятор устраняет последний. То есть он сохраняет перегрузку, требующую наименьшего объема расширения.
Один кандидат. Он продолжает рассматривать перегрузки в парах, пока не останется только одна перегрузка, и она разрешает вызов этой перегрузки. Если компилятор не может уменьшить перегрузки до одного кандидата, он создает ошибку.
На следующем рисунке показан процесс, определяющий, какой из наборов перегруженных версий для вызова.
В следующем примере показан процесс разрешения перегрузки.
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 |
См. также
- Необязательные параметры
- Массивы параметров
- Перегрузка процедур
- Рекомендации по устранению неполадок
- Практическое руководство. Определение различных версий процедуры
- Практическое руководство. Вызов перегруженной процедуры
- Практическое руководство. Перегрузка процедуры, которая принимает один необязательный параметр
- Практическое руководство. Перегрузка процедуры, принимающей неопределенное число параметров
- Вопросы, связанные с перегрузкой процедур
- Overloads
- Методы расширения