Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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:
- Zugänglichkeit. Es beseitigt Überlastungen durch eine Zugriffsebene, die verhindert, dass der aufrufende Code darauf zugreifen kann.
- Anzahl der Parameter. Es beseitigt alle Überladungen, die eine andere Anzahl von Parametern definieren, als im Aufruf angegeben werden.
- 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.
- 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
oderOff
ist. - 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.
- 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.
- 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.
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
- Optionale Parameter
- Parameterarrays
- Prozedurüberladung
- Problembehandlungsverfahren
- So definieren Sie mehrere Versionen eines Verfahrens
- Anleitung: Aufrufen einer überladenen Prozedur
- Vorgehensweise: Überladen einer Prozedur, die optionale Parameter akzeptiert
- Vorgehensweise: Überladen einer Prozedur, die eine unbegrenzte Anzahl von Parametern akzeptiert
- Überlegungen zur Prozedurüberladung
- Überladungen
- Erweiterungsmethoden