дозвіл перевантаження

Коли компілятор Visual Basic виявляє виклик процедури, визначеної в декількох перевантажених версіях, він повинен визначити, яку перевантажену версію необхідно викликати. Для цього компілятор виконує наступні дії:

Доступність. З розгляду виключаються ті перевантажені версії, які забороняють зухвалому коду їх викликати.

Число параметрів. З розгляду виключаються ті перевантажені версії, в яких визначено інше число параметрів, ніж задано у виклику.

Типи даних параметрів. Компілятор краще використовує методи екземпляра, а не методам розширення. Якщо знайдений метод примірника, що вимагає для зіставлення викликом процедури тільки розширення widening, все методи розширення видаляються, і компілятор продовжує використовувати тільки кандидати методу примірника. Якщо такий метод екзеспляра не знайдений, компілятор продовжує використовувати як методи примірника, так і методи розширення.

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

Звужують перетворення. З розгляду виключаються ті перевантажені версії, для яких потрібно звужує перетворення типів аргументів виклику в певні типи параметрів. Це залежить від того, яка величина є має ключ перевірки типів (Оператор Option Strict) On або Off.

Найменша розширення. Компілятор розглядають залишилися перевантаження парами. Для кожної пари компілятор порівнює типи даних певних параметрів. Якщо в одній з перевантажень всі типи розширюються до відповідних типів інший перевантаження, компілятор виключає останню. Іншими словами, залишається та перевантаження, яка вимагає меншого розширення при перетворенні.

Єдиний варіант. Компілятор продовжує розглядати перевантаження попарно до тих пір, поки не залишиться тільки одна перевантаження, яка і викликається. Якщо цей процес не сходиться до єдиної перевантаження, створюється помилка.

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

Дозвіл в перевантажених версіях

У наступному прмере наведено процес розв'язання перевантажуються версій.

У першому виклику компілятор усуває першу перевантаження, так як тип першого аргументу (Short) звужується до типу відповідного параметра (Byte). Потім виключаються третя перевантаження, так як кожен тип аргументу в другій перевантаження (Short і Single) може бути розширений до відповідного типу в третій перевантаження (Integer і Single). Друга перевантажена версія вимагає меншого розширення, тому компілятор використовує її для виклику.

У другому виклику компілятор не може усунути будь-яку з перевантажень в залежності від звуження. Третя перевантаження виключається з тієї ж причини, що і в першому виклику, оскільки можна викликати другу перевантаження з меншим розширенням типів аргументів. Однак компілятору не вдається вибрати між першою і другою перевантаженнями. Кожна має один певний тип параметра, який розширюється до відповідного типу в інший (Byte і Short. Але Single і Double). Тому компілятор створює помилку дозволу перевантаження.

Якщо дві перевантаження процедури мають ідентичні підписи, за винятком того, що останній параметр оголошується Optional (Visual Basic) в одній і ParamArray в інший, компілятор дозволяє виклик процедури, в такий спосіб:

Якщо останній аргумент заданий при виклику як

Схожі статті