Partilhar via


Resolução de sobrecarga (Visual Basic)

Quando o compilador do Visual Basic encontra uma chamada para um procedimento que é 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 o código de chamada de chamá-lo.

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

  3. Tipos de dados de parâmetros. O compilador dá preferência aos métodos de instância sobre os métodos de extensão. Se for encontrado algum método de instância que exija apenas a ampliação de conversões para corresponder à 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 os métodos de instância e extensão.

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

  4. Estreitando conversões. Ele elimina qualquer sobrecarga que exija uma conversão restrita dos tipos de argumento de chamada para os tipos de parâmetros definidos. Isso é verdadeiro se a opção de verificação de tipo (Option Strict Statement) for On ou Off.

  5. Menos alargamento. O compilador considera as sobrecargas restantes em pares. Para cada par, ele compara os tipos de dados dos parâmetros definidos. Se os tipos em uma das sobrecargas todos se ampliam para os tipos correspondentes na outra, o compilador elimina o último. Ou seja, retém a sobrecarga que requer a menor quantidade de alargamento.

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

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

Flow diagram of overload resolution process

O exemplo a seguir ilustra esse 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 estreita para o tipo do parâmetro correspondente (Byte). Em seguida, elimina a terceira sobrecarga porque cada tipo de argumento na segunda sobrecarga (Short e Single) se amplia para o tipo correspondente na terceira sobrecarga (Integer e Single). A segunda sobrecarga requer menos ampliação, então o compilador a usa para a chamada.

Na segunda chamada, o compilador não pode eliminar nenhuma das sobrecargas com base no estreitamento. Ele elimina a terceira sobrecarga pelo mesmo motivo da primeira chamada, porque pode chamar a segunda sobrecarga com menos ampliaçã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 se alarga para o tipo correspondente no outro (Byte a Short, mas Single a Double). O compilador, portanto, gera um erro de resolução de sobrecarga.

Argumentos opcionais e ParamArray sobrecarregados

Se duas sobrecargas de um procedimento tiverem assinaturas idênticas, exceto que o último parâmetro é declarado Optional em um e ParamArray no outro, o compilador resolve uma chamada para esse procedimento da seguinte maneira:

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

Consulte também