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:
Ułatwienia dostępu. Eliminuje ono wszelkie przeciążenia z poziomem dostępu, który uniemożliwia wywoływanie kodu.
Liczba parametrów. Eliminuje to wszelkie przeciążenia, które definiuje inną liczbę parametrów niż są dostarczane w wywołaniu.
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.
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
czyOff
.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.
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.
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ż
- Parametry opcjonalne
- Tablice parametrów
- Przeciążanie procedury
- Rozwiązywanie problemów z procedurami
- Instrukcje: definiowanie wielu wersji procedury
- Instrukcje: wywoływanie procedury przeciążenia
- Instrukcje: przeciążanie procedury korzystającej z parametrów opcjonalnych
- Instrukcje: przeciążanie procedury korzystającej z nieokreślonej liczby parametrów
- Zagadnienia dotyczące przeciążania procedur
- Overloads
- Metody rozszerzeń