Auf Englisch lesen

Freigeben über


Überladungsauflösung (Visual Basic)

Der Visual Basic-Compiler muss entscheiden, welche Überladung aufgerufen werden soll, wenn eine Prozedur in mehreren überladenen Versionen definiert ist. Es entscheidet, indem es die folgenden Schritte ausführt:

  1. Zugänglichkeit. Es beseitigt Überlastungen durch eine Zugriffsebene, die verhindert, dass der aufrufende Code darauf zugreifen kann.
  2. Anzahl der Parameter. Es beseitigt alle Überladungen, die eine andere Anzahl von Parametern definieren, als im Aufruf angegeben werden.
  3. Parameterdatentypen. Der Compiler gibt Instanzmethoden vor Erweiterungsmethoden den Vorzug. Wenn eine Instanzmethode gefunden wird, die nur erweiternde Umwandlungen erfordert, um dem Prozeduraufruf zu entsprechen, werden alle Erweiterungsmethoden verworfen. Der Compiler arbeitet weiterhin nur mit den Kandidaten für Instanzmethoden. Wenn keine solche Instanzmethode gefunden wird, wird sie mit Instanzen- und Erweiterungsmethoden fortgesetzt. In diesem Schritt werden alle Überladungen entfernt, für die die Datentypen der aufrufenden Argumente nicht in die parametertypen konvertiert werden können, die in der Überladung definiert sind.
  4. Einschränkende Konvertierungen Sie beseitigt alle Überladungen, die eine schmale Konvertierung von den aufrufenden Argumenttypen in die definierten Parametertypen erfordern. Dieser Schritt erfolgt unabhängig davon, ob der Typüberprüfungsschalter (Option Strict Statement) On oder Offist.
  5. Geringste Erweiterung Der Compiler erwägt die verbleibenden Überladungen paarweise. Für jedes Paar werden die Datentypen der definierten Parameter verglichen. Wenn die Typen in einer der Überladungen alle auf die entsprechenden Typen in der anderen erweitert werden, beseitigt der Compiler letztere. Das heißt, es behält die Überladung bei, die den geringsten Erweiterungsbedarf erfordert.
  6. Priorität der Überladungsauflösung. Der Compiler entfernt alle Überladungen, deren OverloadResolutionPriorityAttribute-Wert niedriger als der höchste Wert für alle Kandidatenüberladungen ist. Jeder Überladung ohne dieses Attribut wird der Standardwert null zugewiesen.
  7. Einzelner Kandidat. 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, wird ein Fehler generiert.

Die folgende Abbildung zeigt den Prozess, der bestimmt, welche von einer Reihe überladener Versionen aufgerufen werden soll.

Flussdiagramm des Überladungsauflösungsprozesses

Im folgenden Beispiel wird dieser Überlastungsauflösungsprozess 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)

Im ersten Aufruf entfernt der Compiler die erste Überladung, da sich der Typ des ersten Arguments (Short) auf den Typ des entsprechenden Parameters (Byte) beschrä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 erweitert (Integer und Single). Die zweite Überladung erfordert weniger Erweiterung, sodass der Compiler sie für den Aufruf verwendet.

Im zweiten Aufruf kann der Compiler keine der Überladungen aufgrund einer Eingrenzung ausschließen. Sie beseitigt die dritte Überladung aus demselben Grund wie im ersten Aufruf, da sie die zweite Überladung mit weniger Verbreiterung der Argumenttypen aufrufen kann. Der Compiler kann jedoch nicht zwischen der ersten und der zweiten Überladung auflösen. Jeder hat einen definierten Parametertyp, der auf den entsprechenden Typ in der anderen erweitert wird (Byte auf Short, aber Single auf Double). Der Compiler generiert daher einen Überladungsauflösungsfehler.

Überladene Optional- und ParamArray-Argumente

Wenn zwei Überladungen einer Prozedur identische Signaturen aufweisen, mit der Ausnahme, dass der letzte Parameter Optional in einer und ParamArray- in der anderen deklariert wird, 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 nicht angegeben) Optional
Ein einzelner Wert Optional
Mindestens zwei Werte in einer durch Trennzeichen getrennten Liste ParamArray
Ein Array einer beliebigen Länge (einschließlich eines leeren Arrays) ParamArray

Siehe auch