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:
Toegankelijkheid. Het elimineert elke overbelasting met een toegangsniveau dat voorkomt dat de aanroepende code deze aanroept.
Aantal parameters. Het elimineert elke overbelasting die een ander aantal parameters definieert dan wordt opgegeven in de aanroep.
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.
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
ofOff
.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.
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.
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
- Optionele parameters
- Parametermatrices
- Overbelasting van procedure
- Procedures voor probleemoplossing
- Procedure: Meerdere versies van een procedure definiëren
- Procedure: Een overbelaste procedure aanroepen
- Procedure: Een procedure overbelasten die optionele parameters gebruikt
- Procedure: Een procedure overbelasten waarvoor een onbeperkt aantal parameters nodig is
- Overwegingen bij overbelastingsprocedures
- Overbelastingen
- Extensiemethoden
Feedback
https://aka.ms/ContentUserFeedback.
Binnenkort beschikbaar: In de loop van 2024 zullen we GitHub-problemen geleidelijk uitfaseren als het feedbackmechanisme voor inhoud en deze vervangen door een nieuw feedbacksysteem. Zie voor meer informatie:Feedback verzenden en weergeven voor