Partilhar via


Resolução de sobrecarga (Visual Basic)

O compilador do Visual Basic deve decidir qual sobrecarga chamar quando um procedimento é definido em várias versões sobrecarregadas. Ele decide executando as seguintes etapas:

  1. Acessibilidade. Ele elimina qualquer sobrecarga com um nível de acesso que impede o código de invocação de o chamar.
  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. O compilador continua com apenas 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. Esta etapa ocorre se a opção de verificação de tipo (Option Strict Statement) estiver On ou Off.
  5. Menor Alargamento. 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 alargam para os tipos correspondentes na outra, o compilador elimina este último. Ou seja, retém a sobrecarga que requer a menor quantidade de alargamento.
  6. Prioridade de resolução de sobrecarga. O compilador remove qualquer sobrecarga que tenha um OverloadResolutionPriorityAttribute menor do que o valor mais alto em qualquer sobrecarga candidata. Qualquer sobrecarga sem esse atributo recebe o valor padrão de zero.
  7. 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 puder reduzir as sobrecargas a um único candidato, ele gerará um erro.

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

Fluxograma do processo de resolução de sobrecarga

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) aumenta 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 consegue eliminar nenhuma das sobrecargas com base na restrição. 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 para Short, mas Single para Double). O compilador, portanto, gera um erro de resolução de sobrecarga.

Argumentos sobrecarregados Optional e ParamArray

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 ao declarar 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

Ver também