Delen via


Overbelastingsresolutie (Visual Basic)

De Visual Basic-compiler moet bepalen welke overbelasting moet worden aangeroepen wanneer een procedure wordt gedefinieerd in verschillende overbelaste versies. Het besluit door de volgende stappen uit te voeren:

  1. Toegankelijkheid. Het elimineert elke overbelasting met een toegangsniveau dat voorkomt dat de aanroepende code deze aanroept.
  2. Aantal parameters. Het elimineert elke overbelasting die een ander aantal parameters definieert dan wordt opgegeven in de aanroep.
  3. Parametergegevenstypen. De compiler geeft voorkeur voor exemplaarmethoden ten opzichte van extensiemethoden. Als er een exemplaarmethode wordt gevonden waarvoor alleen verbreedingsconversies nodig zijn om overeen te komen met de procedure-aanroep, worden alle extensiemethoden verwijderd. De compiler gaat verder met alleen de kandidaten voor de instantiemethode. Als er geen dergelijke instantiemethode wordt gevonden, wordt deze voortgezet met zowel exemplaar- als extensiemethoden. In deze stap wordt elke overbelasting geëlimineerd waarvoor de gegevenstypen van de aanroepende argumenten niet kunnen worden geconverteerd naar de parametertypen die zijn gedefinieerd in de overbelasting.
  4. Vermalingsconversies. Het elimineert elke overbelasting waarvoor een beperkte conversie van de aanroepende argumenttypen naar de gedefinieerde parametertypen is vereist. Deze stap vindt plaats ongeacht of de typecontroleschakelaar (Option Strict Statement) On of Offis.
  5. Minimale verbreding De compiler beschouwt de resterende overbelastingen in paren. Voor elk paar worden de gegevenstypen van de gedefinieerde parameters vergeleken. Als de typen in een van de overbelastingen allemaal worden verbreed naar de corresponderende typen in de andere, dan elimineert de compiler de laatstgenoemde. Dat wil gezegd, het behoudt de overbelasting die de minste hoeveelheid verbreding vereist.
  6. Prioriteit bij het oplossen van overbelasting. De compiler verwijdert elke overbelasting met een lagere OverloadResolutionPriorityAttribute dan de hoogste waarde voor elke kandidaat-overbelasting. Aan elke overbelasting zonder dit kenmerk wordt de standaardwaarde nul toegewezen.
  7. Eén kandidaat. Het blijft rekening houden met overbelasting in paren totdat slechts één overbelasting overblijft en het lost de aanroep van die overbelasting op. Als de compiler de overbelasting niet kan verminderen tot één kandidaat, wordt er een fout gegenereerd.

In de volgende afbeelding ziet u het proces waarmee wordt bepaald welke van een set overbelaste versies moet worden aangeroepen.

stroomdiagram van het proces voor overbelastingsresolutie

In het volgende voorbeeld ziet u dit overbelastingsoplossingsproces.

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)

In de eerste aanroep elimineert de compiler de eerste overbelasting omdat het type van het eerste argument (Short) beperkt tot het type van de bijbehorende parameter (Byte). Het elimineert vervolgens de derde overbelasting omdat elk argumenttype in de tweede overbelasting (Short en Single) breder wordt naar het bijbehorende type in de derde overbelasting (Integer en Single). De tweede overbelasting vereist minder verbreeding, dus de compiler gebruikt deze voor de aanroep.

In de tweede aanroep kan de compiler geen overloads elimineren op basis van versmalling. Het elimineert de derde overbelasting om dezelfde reden als in de eerste aanroep, omdat deze de tweede overbelasting kan aanroepen met minder verbreiding van de argumenttypen. De compiler kan echter niet beslissen tussen de eerste en tweede overloads. Elk heeft één gedefinieerd parametertype dat verruimt naar het bijbehorende type in het andere (Byte naar Short, maar Single naar Double). De compiler genereert daarom een overbelastingsoplossingsfout.

Overladen argumenten Optional en ParamArray

Als twee overbelastingen van een procedure identieke handtekeningen hebben, behalve dat de laatste parameter wordt gedeclareerd Optioneel in een en ParamArray- in de andere, lost de compiler als volgt een aanroep naar die procedure op:

Als de aanroep het laatste argument levert als De compiler lost het oproep van de overloadfunctie op die het laatste argument verklaart als
Geen waarde (argument weggelaten) Optional
Eén waarde Optional
Twee of meer waarden in een door komma's gescheiden lijst ParamArray
Een matrix van elke lengte (inclusief een lege matrix) ParamArray

Zie ook