Risoluzione dell'overload (Visual Basic)
Il compilatore di Visual Basic deve decidere quale sovraccarico chiamare quando una procedura è definita in diverse versioni sovraccariche. Decide eseguendo i passaggi seguenti:
- Accessibilità. Elimina qualsiasi overload con un livello di accesso che evita che il codice chiamante possa invocarlo.
- Numero di parametri. Elimina qualsiasi overload che definisce un numero diverso di parametri rispetto a quelli forniti nella chiamata.
- Tipi di dati dei parametri. Il compilatore assegna preferenze ai metodi di istanza rispetto ai metodi di estensione. Se viene rilevato un metodo di istanza che richiede solo conversioni di tipo widening per corrispondere alla chiamata della procedura, tutti i metodi di estensione vengono eliminati. Il compilatore continua solo con i candidati ai metodi di istanza. Se non viene trovato alcun metodo di istanza di questo tipo, continua con i metodi di istanza e di estensione. In questo passaggio elimina qualsiasi overload per il quale i tipi di dati degli argomenti chiamanti non possono essere convertiti nei tipi di parametro definiti nell'overload.
- Conversioni di tipo riduttivo. Elimina qualsiasi overload che richiede una conversione di riduzione dai tipi di argomento chiamanti ai tipi di parametro definiti. Questo passaggio avviene indipendentemente dal fatto che l'opzione di verifica del tipo (Option Strict Statement) sia
On
oppureOff
. - Minima Espansione Il compilatore considera gli overload rimanenti a coppie. Per ogni coppia, confronta i tipi di dati dei parametri definiti. Se i tipi in uno degli overload si ampliano tutti ai tipi corrispondenti nell'altro, il compilatore elimina quest'ultimo. Ciò significa che mantiene l'overload che richiede la quantità minima di estensione.
- Priorità di risoluzione dell'overload. Il compilatore rimuove ogni overload che ha un OverloadResolutionPriorityAttribute inferiore al massimo valore presente in qualsiasi overload candidato. A qualsiasi overload senza questo attributo viene assegnato il valore predefinito zero.
- Candidato singolo. Continua a considerare gli sovraccarichi in coppie fino a quando non ne rimane uno solo e risolve la chiamata a quell'overload. Se il compilatore non riesce a ridurre gli overload a un singolo candidato, viene generato un errore.
Nella figura seguente viene illustrato il processo che determina quale di un set di versioni sovraccariche chiamare.
Nell'esempio seguente viene illustrato questo processo di risoluzione dell'overload.
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)
Nella prima chiamata il compilatore elimina il primo overload perché il tipo del primo argomento (Short
) si restringe al tipo del parametro corrispondente (Byte
). Elimina quindi il terzo overload perché ogni tipo di argomento nel secondo overload (Short
e Single
) si estende al tipo corrispondente nel terzo overload (Integer
e Single
). Il secondo overload richiede un'espansione minore, quindi il compilatore lo utilizza per la chiamata.
Nella seconda chiamata, il compilatore non può eliminare alcuno degli overload basato sul restringimento. Elimina il terzo overload per lo stesso motivo della prima chiamata, perché può chiamare il secondo overload con minore estensione dei tipi di argomento. Tuttavia, il compilatore non è in grado di distinguere tra il primo e il secondo sovraccarico. Ognuno ha un tipo di parametro definito che si estende al tipo corrispondente nell'altro (Byte
a Short
, ma Single
a Double
). Il compilatore genera quindi un errore di risoluzione dell'overload.
Argomenti sovraccaricati Optional
e ParamArray
Se due sovraccarichi di una procedura hanno una firma identica, a eccezione del fatto che l'ultimo parametro è dichiarato facoltativo in uno e ParamArray nell'altro, il compilatore risolve una chiamata a tale procedura come indicato di seguito:
Se la chiamata fornisce l'ultimo argomento, come | Il compilatore risolve la chiamata all'overload dichiarando l'ultimo argomento come |
---|---|
Nessun valore (argomento omesso) | Optional |
Un singolo valore | Optional |
Due o più valori in un elenco delimitato da virgole | ParamArray |
Matrice di qualsiasi lunghezza (inclusa una matrice vuota) | ParamArray |
Vedere anche
- parametri facoltativi
- matrici di parametri
- Sovraccarico di Procedure
- procedure di risoluzione dei problemi
- Procedura: Definire più versioni di una routine
- Come chiamare una procedura sovraccaricata
- Procedura: Sovraccaricare una procedura che accetta parametri facoltativi
- Procedura: Eseguire l'overload di una routine che accetta un numero indefinito di parametri
- considerazioni relative alle procedure di sovraccarico
- Sovraccarichi
- metodi di estensione