Delen via


Overbelastingsresolutie (Visual Basic)

Wanneer de Visual Basic-compiler een aanroep van een procedure tegenkomt die is gedefinieerd in verschillende overbelaste versies, moet de compiler bepalen welke overbelasting moet worden aangeroepen. Dit doet u 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 conversies moeten worden uitgebreid om overeen te komen met de procedure-aanroep, worden alle extensiemethoden verwijderd en wordt de compiler voortgezet 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. Dit is waar of de typecontroleschakelaar (optie strikte instructie) is On of Off.

  5. Least Widening. 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 breder worden naar de bijbehorende typen in de andere, elimineert de compiler de laatste. Dat wil gezegd, het behoudt de overbelasting die de minste hoeveelheid verbreding vereist.

  6. 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.

Flow diagram of overload resolution process

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 overbelastingen elimineren op basis van vermaling. 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 worden opgelost tussen de eerste en tweede overbelasting. Elk heeft één gedefinieerd parametertype dat breder wordt naar het overeenkomstige type in het andere (Byte tot Short, maar Single aan Double). De compiler genereert daarom een overbelastingsoplossingsfout.

Overbelaste optionele en paramarrayargumenten

Als twee overbelastingen van een procedure identieke handtekeningen hebben, behalve dat de laatste parameter optioneel wordt gedeclareerd 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 de aanroep van de overbelasting op die het laatste argument declareren 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