Când compilatorul Visual Basic detectează un apel de procedură definit în mai multe versiuni supraîncărcate, trebuie să determine ce versiune suprasarcină să fie invocată. Pentru aceasta, compilatorul realizează următoarele acțiuni:
Disponibilitate. Din considerente, aceste versiuni supraîncărcate sunt excluse, ceea ce le interzice apelantului să le apeleze.
Număr de parametri. Excepțiile sunt acele versiuni supraîncărcate în care un număr diferit de parametri este definit decât cel specificat în apel.
Tipurile acestor parametri. Compilatorul utilizează de preferință metode de instanță, nu metode de extensie. Dacă ați găsit o metodă de instanță care necesită pentru a compara un apel numai la procedura de extensie Lărgirea, toate metodele de extensie sunt eliminate, iar compilatorul continuă să utilizeze numai candidații metoda instanță. Dacă nu se găsește o astfel de metodă, compilatorul continuă să utilizeze atât metode de instanță, cât și metode de extensie.
În această etapă, versiunile supraîncărcate pentru care tipurile de date ale argumentelor de apel nu pot fi convertite la tipurile de parametri definite în această versiune supraîncărcată sunt excluse din considerente.
Reducerea conversiilor. Din considerente, aceste versiuni supraîncărcate sunt excluse, pentru care este necesară restrângerea conversiei tipurilor de argumente de apel în anumite tipuri de parametri. Acest lucru depinde de care dintre valori are o tastă de verificare a tipului (Opțiune Strict Operator) Pornit sau Oprit.
Cea mai mică extensie. Compilatorul consideră supraîncărcările rămase în perechi. Pentru fiecare pereche, compilatorul compară tipurile de date ale anumitor parametri. Dacă într-una din suprasarcini toate tipurile sunt extinse la tipurile corespunzătoare de altă suprasarcină, compilatorul le exclude pe cele din urmă. Cu alte cuvinte, rămâne supraîncărcarea, care necesită o expansiune mai mică în timpul conversiei.
Singura opțiune. Compilatorul continuă să ia în considerare supraîncărcarea în perechi până când există o singură suprasarcină, care se numește. Dacă acest proces nu converge la o singură suprasarcină, se generează o eroare.
Figura următoare prezintă un proces care definește un set de versiuni supraîncărcate pentru un apel.
Rezoluția în versiuni supraîncărcate
Următorul exemplu prezintă procesul de rezolvare a versiunilor supraîncărcate.
În primul apel, compilatorul elimină prima suprasarcină, deoarece tipul primului argument (Short) se restrânge la tipul parametrului corespunzător (Byte). Apoi, a treia suprasarcină excluse, deoarece fiecare tip de argument în a doua suprasarcină (scurtcircuit și unică) poate fi extins la tipul corespunzător în a treia suprasarcină (Integer și Single). A doua versiune supraîncărcată necesită o extensie mai mică, așa că compilatorul o folosește pentru a apela.
În al doilea apel, compilatorul nu poate elimina nici una dintre suprasarcini în funcție de constricție. A treia suprasarcină este exclusă din același motiv ca și în primul apel, deoarece puteți apela cea de-a doua suprasarcină cu o extensie mai mică a tipurilor de argument. Cu toate acestea, compilatorul nu poate alege între prima și cea de-a doua suprasarcină. Fiecare are un tip specific de parametru care se extinde la tipul corespunzător într-un alt tip (Byte și Short, dar Single și Double). Prin urmare, compilatorul generează o eroare de rezoluție la suprasarcină.
În cazul în care două suprasarcini procedură au semnături identice, cu excepția faptului că ultimul parametru este declarat Opțional (Visual Basic) într-unul și ParamArray în celălalt, compilatorul rezolvă procedura de apel, după cum urmează:
Dacă ultimul argument este specificat atunci când este apelat ca