Resolução de sobrecarga (Visual Basic)

Quando o compilador do Visual Basic encontra uma chamada para um procedimento definido em várias versões sobrecarregadas, o compilador deve decidir qual das sobrecargas chamar. Ele faz isso executando as seguintes etapas:

  1. Acessibilidade. Ele elimina qualquer sobrecarga com um nível de acesso que impede que o código de chamada o chame.

  2. Número de parâmetros. Ele elimina qualquer sobrecarga que define um número diferente de parâmetros dos fornecidos na chamada.

  3. Tipos de dados do parâmetro. O compilador dá preferência a métodos de instância em relação a métodos de extensão. Se for encontrado algum método de instância que exija apenas que as conversões de expansão correspondam à chamada de procedimento, todos os métodos de extensão serão descartados, e o compilador continuará apenas com os candidatos ao método de instância. Se nenhum método de instância for encontrado, ele continuará com métodos de instância e de extensão.

    Nesta etapa, ela elimina qualquer sobrecarga para a qual os tipos de dados dos argumentos de chamada não podem ser convertidos nos tipos de parâmetro definidos na sobrecarga.

  4. Conversões de restrição. Ele elimina qualquer sobrecarga que exija uma conversão de restrição dos tipos de argumento de chamada para os tipos de parâmetro definidos. Isso é verdade se o switch de verificação de tipo (Instrução Opção Estrita) é On ou Off.

  5. Menor expansão. O compilador considera as sobrecargas restantes em pares. Para cada par, ele compara os tipos de dados dos parâmetros definidos. Se todos os tipos em uma das sobrecargas se expandirem para os tipos correspondentes na outra, o compilador eliminará a última. Ou seja, ele mantém a sobrecarga que requer a menor expansão.

  6. Candidato único. Ele continua considerando sobrecargas em pares até que apenas uma sobrecarga permaneça, e resolve a chamada para essa sobrecarga. Se o compilador não puder reduzir as sobrecargas para um único candidato, ele gerará um erro.

A ilustração a seguir mostra o processo que determina qual versão de um conjunto de versões sobrecarregadas será chamada.

Flow diagram of overload resolution process

O exemplo a seguir ilustra o processo de resolução de sobrecarga.

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)

Na primeira chamada, o compilador elimina a primeira sobrecarga porque o tipo do primeiro argumento (Short) se restringe ao tipo do parâmetro correspondente (Byte). Em seguida, ele elimina a terceira sobrecarga porque cada tipo de argumento na segunda sobrecarga (Short e Single) é expandido para o tipo correspondente na terceira sobrecarga (Integer e Single). A segunda sobrecarga requer menos expansão, portanto, o compilador a usa para a chamada.

Na segunda chamada, o compilador não pode eliminar nenhuma das sobrecargas com base na restrição. Ele elimina a terceira sobrecarga pelo mesmo motivo que na primeira chamada, pois pode chamar a segunda sobrecarga com menos expansão dos tipos de argumento. No entanto, o compilador não pode resolver entre a primeira e a segunda sobrecargas. Cada um tem um tipo de parâmetro definido que é expandido para o tipo correspondente no outro (Byte para Short, mas Single para Double). Portanto, o compilador gera um erro de resolução de sobrecarga.

Argumentos Opcional e ParamArray sobrecarregados

Se duas sobrecargas de um procedimento tiverem assinaturas idênticas, exceto que o último parâmetro será declarado Opcional em um e ParamArray no outro, o compilador resolverá uma chamada para esse procedimento conforme segue:

Se a chamada fornecer o último argumento como O compilador resolve a chamada para a sobrecarga declarando o último argumento como
Nenhum valor (argumento omitido) Optional
Um único valor Optional
Dois ou mais valores em uma lista separada por vírgulas ParamArray
Uma matriz de qualquer comprimento (incluindo uma matriz vazia) ParamArray

Confira também