Dela via


Överlagringslösning (Visual Basic)

Visual Basic-kompilatorn måste bestämma vilken överlagring som ska anropas när en procedur definieras i flera överlagrade versioner. Den bestämmer genom att utföra följande steg:

  1. Tillgänglighet. Det eliminerar all överbelastning med en åtkomstnivå som förhindrar den anropande koden från att anropa den.
  2. Antal parametrar. Den eliminerar all överbelastning som definierar ett annat antal parametrar än vad som anges i anropet.
  3. Parameterdatatyper. Kompilatorn ger instansmetoder företräde framför tilläggsmetoder. Om någon instansmetod hittas som bara kräver bredare konverteringar för att matcha proceduranropet, tas alla tilläggsmetoder bort. Kompilatorn fortsätter bara med instansmetodens kandidater. Om ingen sådan instansmetod hittas fortsätter den med både instans- och tilläggsmetoder. I det här steget eliminerar den alla överlagringar som datatyperna för anropande argumenten inte kan konverteras till de parametertyper som definierats i överlagringarna.
  4. Begränsa konverteringar. Den eliminerar all överbelastning som kräver en begränsad konvertering från de anropande argumenttyperna till de definierade parametertyperna. Det här steget sker oavsett om typkontrollväxeln (Alternativet Strikt instruktion) är On eller Off.
  5. Minsta breddning. Kompilatorn beaktar de återstående överlagringarna parvis. För varje par jämförs datatyperna för de definierade parametrarna. Om typerna i en av överlagringarna vidgas till motsvarande typer i den andra, eliminerar kompilatorn det senare. Det innebär att den behåller den överbelastning som kräver minst breddning.
  6. Prioritet för överbelastningsmatchning. Kompilatorn tar bort alla överlagringar som har en lägre OverloadResolutionPriorityAttribute än det högsta värdet på några kandidatöverlagringar. All överlagring utan det här attributet tilldelas standardvärdet noll.
  7. Enskild kandidat. Det fortsätter att överväga överlagringar i par tills endast en överlagring finns kvar, och det löser anropet till den överlagringen. Om kompilatorn inte kan minska överbelastningarna till en enskild kandidat genererar den ett fel.

Följande bild visar den process som avgör vilken av en uppsättning överlagrade versioner som ska anropas.

Flödesdiagram över överbelastningsmatchningsprocessen

I följande exempel visas den här överbelastningsmatchningsprocessen.

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)

I det första anropet eliminerar kompilatorn den första överlagringen eftersom typen av det första argumentet (Short) begränsas till typen av motsvarande parameter (Byte). Den eliminerar sedan den tredje överbelastningen eftersom varje argumenttyp i den andra överlagringen (Short och Single) vidgas till motsvarande typ i den tredje överlagringen (Integer och Single). Den andra överlagringen kräver mindre breddning, så kompilatorn använder den för anropet.

I det andra anropet kan kompilatorn inte eliminera någon av överbelastningarna baserat på inskränkning. Den eliminerar den tredje överbelastningen av samma anledning som i det första anropet, eftersom den kan anropa den andra överbelastningen med mindre breddning av argumenttyperna. Kompilatorn kan dock inte avgöra mellan den första och den andra överlagringen. Var och en har en definierad parametertyp som vidgas till motsvarande typ i den andra (Byte till Short, men Single till Double). Kompilatorn genererar därför ett överbelastningsmatchningsfel.

Överbelastade argument för Optional och ParamArray

Om två överlagringar av en procedur har identiska signaturer förutom att den sista parametern deklareras Valfri i en och ParamArray i den andra, löser kompilatorn ett anrop till proceduren på följande sätt:

Om anropet levererar det sista argumentet som Kompilatorn löser anropet till överlagringen som deklarerar det sista argumentet som
Inget värde (argumentet utelämnas) Optional
Ett enda värde Optional
Två eller flera värden i en kommaavgränsad lista ParamArray
En matris med valfri längd (inklusive en tom matris) ParamArray

Se även