Поделиться через


Разрешение перегрузки

Обновлен: Ноябрь 2007

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

  1. Доступность. Из рассмотрения исключаются те перегруженные версии, которые запрещают вызывающему коду их вызывать.

  2. Число параметров. Из рассмотрения исключаются те перегруженные версии, в которых определено другое число параметров, чем задано в вызове.

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

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

  4. Сужающие преобразования. Из рассмотрения исключаются те перегруженные версии, для которых требуется сужающее преобразование типов аргументов вызова в определенные типы параметров. Это зависит от того, какое из значений имеет ключ проверки типов (Оператор Option Strict) On или Off.

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

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

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

Разрешение в перегруженных версиях
Схема потока перегруженного процесса разрешения

В следующем прмере приведен процесс разрешения перегружаемых версий.

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 (Visual Basic) в одной и ParamArray в другой, компилятор разрешает вызов процедуры, следующим образом:

Если последний аргумент задан при вызове как

Компилятор вызывает перегрузку, в которой последний аргумент объявлен как

Нет значения (аргумент опущен)

Optional

Одиночное значение

Optional

Два или несколько значений, разделенных запятыми

ParamArray

Массив произвольной длины (в частности, пустой массив)

ParamArray

См. также

Задачи

Устранение неполадок в процедурах

Практическое руководство. Определение различных версий процедуры

Практическое руководство. Вызов перегруженной процедуры

Практическое руководство. Перегрузка процедуры, которая принимает один опциональный параметр

Практическое руководство. Перегрузка процедуры, принимающей неопределенное число параметров

Основные понятия

Необязательные параметры

Массивы параметров

Перегрузка процедур

Вопросы, связанные с перегрузкой процедур

Методы расширения (Visual Basic)

Ссылки

Overloads