Condividi tramite


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:

  1. Accessibilità. Elimina qualsiasi overload con un livello di accesso che evita che il codice chiamante possa invocarlo.
  2. Numero di parametri. Elimina qualsiasi overload che definisce un numero diverso di parametri rispetto a quelli forniti nella chiamata.
  3. 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.
  4. 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 oppure Off.
  5. 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.
  6. 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.
  7. 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.

diagramma di flusso del processo di risoluzione dell'overload

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