Freigeben über


Überladungsauflösung (Visual Basic)

Wenn der Visual Basic-Compiler auf den Aufruf einer Prozedur stößt, die in mehreren überladenen Versionen definiert ist, muss der Compiler entscheiden, welche der Überladungen aufgerufen werden soll. Er entscheidet dies, indem er die folgenden Schritte ausführt:

  1. Barrierefreiheit Er schließt jede Überladung mit einer Zugriffsebene aus, die den aufrufenden Code am Aufrufen der Überladung hindert.

  2. Anzahl von Parametern Es wird jede Überladung ausgeschlossen, die eine andere Anzahl von Parametern definiert als im Aufruf angegeben.

  3. Parameterdatentypen. Der Compiler gibt Instanzmethoden Vorrang gegenüber Erweiterungsmethoden. Wenn eine Instanzmethode gefunden wird, die nur erweiternde Konvertierungen erfordert, um dem Prozeduraufruf zu entsprechen, werden alle Erweiterungsmethoden entfernt, und der Compiler fährt nur mit den Instanzmethodenkandidaten fort. Wenn keine solche Instanzmethode gefunden wird, fährt er sowohl mit Instanz- als auch mit Erweiterungsmethoden fort.

    In diesem Schritt wird jede Überladung beseitigt, für die die Datentypen der aufrufenden Argumente nicht in die in der Überladung definierten Parametertypen konvertiert werden können.

  4. Einschränkende Konvertierungen Er entfernt jede Überladung, die eine einschränkende Konvertierung von den aufrufenden Argumenttypen in die definierten Parametertypen erfordert. Dies gilt unabhängig davon, ob der Typüberprüfungsschalter (Option „Strict-Anweisung“) On oder Off ist.

  5. Geringste Erweiterung Der Compiler berücksichtigt die verbleibenden Überladungen paarweise. Für jedes Paar werden die Datentypen der definierten Parameter verglichen. Wenn sich die Typen in einer der Überladungen alle zu den entsprechenden Typen in der anderen erweitern, beseitigt der Compiler letztere. Das heißt, er behält die Überladung, die die geringste Erweiterung erfordert.

  6. Einzelkandidat Er fährt mit der Berücksichtigung der Überladungen in Paaren fort, bis nur noch eine Überladung übrig bleibt, zu der der Aufruf dann aufgelöst wird. Wenn der Compiler die Überladungen nicht auf einen einzelnen Kandidaten reduzieren kann, generiert er einen Fehler.

Die folgende Abbildung zeigt den Prozess, der bestimmt, welcher Satz überladener Versionen aufgerufen werden soll.

Flow diagram of overload resolution process

Dieser Überladungsauflösungsprozess wird anhand des folgenden Beispiels veranschaulicht.

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)

Beim ersten Aufruf entfernt der Compiler die erste Überladung, da sich der Typ des ersten Arguments (Short) auf den Typ des entsprechenden Parameters (Byte) einschränkt. Anschließend wird die dritte Überladung entfernt, da jeder Argumenttyp in der zweiten Überladung (Short und Single) auf den entsprechenden Typ in der dritten Überladung (Integer und Single) erweitert wird. Die zweite Überladung erfordert eine geringere Erweiterung, sodass der Compiler sie für den Aufruf verwendet.

Im zweiten Aufruf kann der Compiler keine der Überladungen auf Grundlage der Einschränkung beseitigen. Er entfernt die dritte Überladung aus demselben Grund wie beim ersten Aufruf, weil die zweite Überladung mit einer geringeren Erweiterung der Argumenttypen aufgerufen werden kann. Der Compiler kann jedoch nicht zwischen der ersten und zweiten Überladung auflösen. Jede verfügt über einen definierten Parametertyp, der auf den entsprechenden Typ in der anderen Überladung erweitert wird (Byte auf Short, aber Single auf Double). Der Compiler generiert daher einen Überladungsauflösungsfehler.

Überladene Optionale und ParamArray-Argumente

Wenn zwei Überladungen einer Prozedur identische Signaturen aufweisen, mit dem Unterschied, dass der letzte Parameter in der einen als Optional und in der anderen als ParamArray deklariert ist, löst der Compiler einen Aufruf dieser Prozedur wie folgt auf:

Wenn der Aufruf das letzte Argument bereitstellt als Löst der Compiler den Aufruf der Überladung auf, die das letzte Argument deklariert als
Kein Wert (Argument ausgelassen) Optional
Ein einzelner Wert Optional
Zwei oder mehr Werte in eine durch Kommas getrennten Liste ParamArray
Ein Array beliebiger Länge (einschließlich eines leeren Arrays) ParamArray

Siehe auch