Udostępnij za pośrednictwem


Rozpoznanie przeciążenia (Visual Basic)

Gdy kompilator języka Visual Basic napotka wywołanie procedury zdefiniowanej w kilku przeciążonych wersjach, kompilator musi zdecydować, które przeciążenia mają być wywoływane. W tym celu należy wykonać następujące czynności:

  1. Ułatwienia dostępu. Eliminuje ono wszelkie przeciążenia z poziomem dostępu, który uniemożliwia wywoływanie kodu.

  2. Liczba parametrów. Eliminuje to wszelkie przeciążenia, które definiuje inną liczbę parametrów niż są dostarczane w wywołaniu.

  3. Typy danych parametrów. Kompilator udostępnia preferencje metod wystąpień za pośrednictwem metod rozszerzeń. Jeśli zostanie znaleziona jakakolwiek metoda wystąpienia, która wymaga tylko rozszerzenia konwersji w celu dopasowania do wywołania procedury, wszystkie metody rozszerzenia zostaną porzucone, a kompilator będzie nadal używać tylko kandydatów metody wystąpienia. Jeśli taka metoda wystąpienia nie zostanie znaleziona, będzie nadal używać metod wystąpień i rozszerzeń.

    W tym kroku eliminuje on wszelkie przeciążenia, dla których nie można przekonwertować typów danych argumentów wywołujących na typy parametrów zdefiniowane w przeciążeniu.

  4. Zawężanie konwersji. Eliminuje to wszelkie przeciążenia, które wymagają konwersji zawężającej z typów argumentów wywołujących do zdefiniowanych typów parametrów. Jest to prawdą, czy przełącznik sprawdzania typów (instrukcja strict opcji) to On czy Off.

  5. Najmniej rozszerzające. Kompilator uwzględnia pozostałe przeciążenia w parach. Dla każdej pary porównuje typy danych zdefiniowanych parametrów. Jeśli typy w jednym z przeciążeń rozszerzają się do odpowiednich typów w drugim, kompilator eliminuje ten ostatni. Oznacza to, że zachowuje przeciążenie, które wymaga najmniejszej ilości rozszerzania.

  6. Jeden kandydat. Nadal rozważa przeciążenia w parach, dopóki tylko jedno przeciążenie nie pozostanie i rozwiąże wywołanie tego przeciążenia. Jeśli kompilator nie może zmniejszyć przeciążeń do jednego kandydata, generuje błąd.

Na poniższej ilustracji przedstawiono proces określający, który z zestawów przeciążonych wersji do wywołania.

Flow diagram of overload resolution process

Poniższy przykład ilustruje ten proces rozwiązywania przeciążenia.

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)

W pierwszym wywołaniu kompilator eliminuje pierwsze przeciążenie, ponieważ typ pierwszego argumentu (Short) zawęża typ odpowiedniego parametru (Byte). Następnie eliminuje trzecie przeciążenie, ponieważ każdy typ argumentu w drugim przeciążeniu (Short i Single) rozszerza się do odpowiedniego typu w trzecim przeciążeniu (Integer i Single). Drugie przeciążenie wymaga mniejszego rozszerzenia, więc kompilator używa go do wywołania .

W drugim wywołaniu kompilator nie może wyeliminować żadnego z przeciążeń na podstawie zawężenia. Eliminuje trzecie przeciążenie z tej samej przyczyny co w pierwszym wywołaniu, ponieważ może wywołać drugie przeciążenie z mniejszym rozszerzaniem typów argumentów. Jednak kompilator nie może rozpoznać między pierwszym i drugim przeciążeniami. Każdy z nich ma jeden zdefiniowany typ parametru, który rozszerza odpowiedni typ w drugim (Byte do Short, ale Single do Double). W związku z tym kompilator generuje błąd rozwiązywania przeciążenia.

Przeciążone argumenty opcjonalne i paramArray

Jeśli dwa przeciążenia procedury mają identyczne podpisy, z tą różnicą, że ostatni parametr jest zadeklarowany jako Opcjonalny w jednym i ParamArray w drugiej, kompilator rozwiązuje wywołanie tej procedury w następujący sposób:

Jeśli wywołanie dostarcza ostatni argument jako Kompilator rozwiązuje wywołanie przeciążenia deklarującego ostatni argument jako
Brak wartości (argument pominięty) Optional
Pojedyncza wartość Optional
Co najmniej dwie wartości na liście rozdzielanej przecinkami ParamArray
Tablica dowolnej długości (w tym pusta tablica) ParamArray

Zobacz też