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