Überladungsauflösung (Visual Basic)

Wenn der Visual Basic-Compiler auf den Aufruf einer Prozedur trifft, die in mehreren überladenen Versionen definiert ist, muss er entscheiden, welche der Überladungen aufgerufen wird. Dazu werden die folgenden Schritte ausgeführt:

  1. Zugriff. Der Compiler schließt jede Überladung mit einer Zugriffsebene aus, die den Aufrufcode daran hindert, sie aufzurufen.

  2. Anzahl der Parameter. Der Compiler entfernt alle Überladungen, die eine vom Aufruf abweichende Anzahl an Parametern definieren.

  3. Datentypen von Parametern. Der Compiler zieht Instanzmethoden gegenüber Erweiterungsmethoden vor. Wenn eine beliebige Instanzmethode gefunden wurde, die lediglich eine Erweiterungskonvertierung benötigt, um dem Prozeduraufruf zu entsprechen, werden alle Erweiterungsmethoden verworfen. Der Compiler verarbeitet dann ausschließlich geeignete Instanzmethoden. Wenn keine solche Instanzmethode gefunden wird, setzt der Compiler die Verarbeitung sowohl mit Instanzmethoden als auch mit Erweiterungsmethoden fort.

    In diesem Schritt entfernt der Compiler alle Überladungen, bei denen die Datentypen der aufrufenden Argumente nicht in die Parametertypen umgewandelt werden können, die in der Überladung definiert sind.

  4. Eingrenzende Konvertierungen. Der Compiler entfernt alle Überladungen, die eine Eingrenzungskonvertierung aus dem Typ des aufrufenden Arguments in die definierten Parametertypen erfordern. Dies gilt unabhängig davon, ob die Typüberprüfung (Option Strict-Anweisung) den Wert On oder Off hat.

  5. Geringste Erweiterung. Der Compiler betrachtet die übrigen Überladungen paarweise. Bei jedem Paar werden die Datentypen der definierten Parameter verglichen. Wenn alle Typen in einer Überladung zu den entsprechenden Typen in der anderen Überladung erweitert werden, entfernt der Compiler die letztere. Das bedeutet, dass die Überladung mit dem geringsten Erweiterungsaufwand beibehalten wird.

  6. Einzelne Betrachtung. Die Überladungen werden paarweise berücksichtigt, bis eine einzelne Überladung übrig bleibt, dann wird der Aufruf dieser Überladung aufgelöst. Wenn der Compiler die Überladungen nicht bis auf eine einzelne reduzieren kann, generiert er einen Fehler.

Im folgenden Beispiel wird der Prozess veranschaulicht, mit dem bestimmt wird, welche überladenen Versionen aufgerufen werden sollen.

Auflösung bei überladenen Versionen

Flussdiagramm des Überladungsauflösungsprozesses

Im folgenden Beispiel wird dieser Prozess der Überladungsauflösung dargestellt.

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)

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

Im zweiten Aufruf kann der Compiler keine Überladung durch Einschränken ausschließen. Die dritte Überladung wird aus dem gleichen Grund beseitigt wie im ersten Aufruf, da nämlich die zweite Überladung mit geringerer Erweiterung der Argumenttypen aufgerufen werden kann. Zwischen der ersten und zweiten Überladung kann der Compiler jedoch keine Auflösung ausführen. Jede Überladung hat einen definierten Parametertyp, der in der anderen Überladung in den entsprechenden Typ erweitert wird (Byte in Short und Single in Double). Aus diesem Grund generiert der Compiler einen Überladungsauflösungsfehler.

Überladene optionale und ParamArray-Argumente

Wenn die Signaturen von zwei Überladungen einer Prozedur sich nur darin unterscheiden, dass der letzte Parameter in der einen Prozedur als Optional (Visual Basic) und in der anderen als ParamArray (Visual Basic) deklariert ist, löst der Compiler einen Aufruf dieser Prozedur folgendermaßen auf:

Wenn der Aufruf das letzte Argument als Folgendes übergibt:

... löst der Compiler den Aufruf der Überladung auf, in der das letzte Argument als Folgendes deklariert ist:

Kein Wert (Argument ausgelassen)

Optional

Ein einzelner Wert

Optional

Zwei oder mehr Werte in einer durch Trennzeichen getrennten Liste

ParamArray

Ein Array beliebiger Länge (einschließlich eines leeren Arrays)

ParamArray

Siehe auch

Aufgaben

Problembehandlung bei Prozeduren (Visual Basic)

Gewusst wie: Definieren mehrerer Versionen einer Prozedur (Visual Basic)

Gewusst wie: Aufrufen einer überladenen Prozedur (Visual Basic)

Gewusst wie: Überladen einer Prozedur mit optionalen Parametern (Visual Basic)

Gewusst wie: Überladen einer Prozedur mit einer unbestimmten Anzahl von Parametern (Visual Basic)

Referenz

Overloads (Visual Basic)

Konzepte

Optionale Parameter (Visual Basic)

Parameterarrays (Visual Basic)

Prozedurüberladung (Visual Basic)

Überlegungen zur Prozedurüberladung (Visual Basic)

Erweiterungsmethoden (Visual Basic)