Condividi tramite


Risoluzione dell'overload (Visual Basic)

Quando il compilatore di Visual Basic rileva una chiamata a una routine definita in diverse versioni di overload, il compilatore deve decidere quale degli overload chiamare. A tale scopo, esegue questi passaggi:

  1. Accessibilità. Elimina qualsiasi overload con un livello di accesso che impedisce al codice chiamante di chiamarlo.

  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 dà preferenza ai metodi di istanza rispetto ai metodi di estensione. Se viene rilevato un metodo di istanza che richiede solo conversioni che supportano un maggior numero di dati per la chiamata di routine, tutti i metodi di estensione vengono eliminati e il compilatore continua con solo i candidati del metodo 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 cui i tipi di dati degli argomenti chiamanti non possono essere convertiti nei tipi di parametro definiti nell'overload.

  4. Conversioni che supportano un minor numero di dati. Elimina qualsiasi overload che richiede una conversione che supporta un minor numero di dati dai tipi di argomento chiamanti ai tipi di parametro definiti. Ciò vale se l'opzione di controllo del tipo (istruzione Option Strict) è On o Off.

  5. Minima conversione. Il compilatore considera gli overload rimanenti in coppie. Per ogni coppia, confronta i tipi di dati dei parametri definiti. Se i tipi in uno degli overload vengono tutti convertiti nei tipi corrispondenti nell'altro, il compilatore elimina quest'ultimo. Ciò significa che mantiene l'overload che richiede la quantità minima di conversione.

  6. Candidato singolo. Continua a considerare gli overload in coppie fino a quando non rimane un solo overload e risolve la chiamata a tale overload. Se il compilatore non riesce a ridurre gli overload a un singolo candidato, genera un errore.

Nella figura seguente viene illustrato il processo che determina il set di versioni di overload da chiamare.

Flow diagram of overload resolution process

Nell'esempio seguente viene illustrato questo processo di risoluzione degli 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) viene convertito nel tipo del parametro corrispondente (Byte). Elimina quindi il terzo overload perché ogni tipo di argomento nel secondo overload (Short e Single) viene convertito nel tipo corrispondente nel terzo overload (Integer e Single). Il secondo overload richiede minore conversione, quindi il compilatore lo usa per la chiamata.

Nella seconda chiamata, il compilatore non può eliminare alcun overload in base alla conversione. Elimina il terzo overload per lo stesso motivo della prima chiamata, perché può chiamare il secondo overload con minore conversione dei tipi di argomento. Tuttavia, il compilatore non riesce a risolvere tra il primo e il secondo overload. Ognuno ha un tipo di parametro definito che viene convertito nel tipo corrispondente nell'altro (Byte a Short, ma Single a Double). Il compilatore genera quindi un errore di risoluzione dell'overload.

Argomenti Optional e ParamArray di overload

Se due overload di una routine hanno firme identiche, ad eccezione del fatto che l'ultimo parametro è dichiarato Optional in uno e ParamArray nell'altro, il compilatore risolve una chiamata a tale routine 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
Valore singolo Optional
Due o più valori in un elenco delimitato da virgole ParamArray
Matrice di qualsiasi lunghezza (inclusa una matrice vuota) ParamArray

Vedi anche