Compartilhar via


Resolva erros e avisos que afetam a resolução de sobrecarga.

Este artigo aborda os seguintes avisos do compilador:

  • CS0034 - O operador é ambíguo em operandos do tipo 'type1' and 'type2'
  • CS0035 - O operador "operator" é ambíguo em um operando do tipo 'type'
  • CS0111 - O tipo já define um membro chamado 'name' com os mesmos tipos de parâmetros
  • CS0121 - A chamada é ambígua entre os seguintes métodos ou propriedades
  • CS0457 - Conversões ambíguas definidas pelo usuário ao converter de 'type1' para 'type2'
  • CS0663 - Não é possível definir métodos sobrecarregados que diferem apenas em ref e out.
  • CS1007 - Acessador de propriedade já definido
  • CS1019 - Operador unário sobrecarregável esperado
  • CS1020 - Operador binário sobrecarregável esperado
  • CS1501 - Nenhuma sobrecarga para o método 'method' aceita argumentos 'number'
  • CS1534 - O operador binário sobrecarregado 'operator' aceita dois parâmetros
  • CS1535 - O operador unário sobrecarregado 'operator' aceita um parâmetro
  • CS1928 - 'Type' não contém uma definição para 'method' e a melhor sobrecarga de método de extensão 'method' tem alguns argumentos inválidos.
  • CS1929 - 'TypeA' não contém uma definição para 'method' e a melhor sobrecarga de método de extensão 'TypeB.method' requer um receptor do tipo 'TypeC'
  • CS8315 - O operador é ambíguo em operandos
  • CS9261 - Não é possível usar 'OverloadResolutionPriorityAttribute' em um membro de substituição.
  • CS9262 - Não é possível usar 'OverloadResolutionPriorityAttribute' neste membro.

Além disso, o seguinte aviso do compilador:

  • CS3006 - Método sobrecarregado 'method' diferindo apenas em ref ou out, ou na classificação de matriz, não é compatível com CLS

Definição de sobrecarga incorreta

  • CS0663 - Não é possível definir métodos sobrecarregados que diferem apenas em ref e out.
  • CS1019 - Operador unário sobrecarregável esperado
  • CS1020 - Operador binário sobrecarregável esperado
  • CS1534 - O operador binário sobrecarregado "operator" recebe dois parâmetros
  • CS1535 - Operador unário sobrecarregado 'operator' assume um parâmetro

Além disso, o seguinte aviso do compilador:

  • CS3006 - Método sobrecarregado 'method' diferindo apenas em ref ou out, ou na classificação de matriz, não é compatível com CLS

Quando você cria operadores sobrecarregados em sua classe, a assinatura deve corresponder ao número de parâmetros necessários para esse operador. Você tem o número errado de parâmetros na definição do operador.

Além disso, os operadores de sobrecarga devem usar o nome do operador definido. A única exceção é quando você cria um operador de conversão, em que o nome do operador corresponde ao tipo de retorno da conversão.

Sobrecargas duplicadas definidas

  • CS0111 - O tipo já define um membro chamado 'name' com os mesmos tipos de parâmetros
  • CS1007 - O acessador de propriedade já está definido

Esses erros indicam que você criou sobrecargas que não são diferentes. Os motivos comuns incluem:

  • Os tipos de parâmetro correspondentes têm uma conversão de identidade. Por exemplo M(dynamic) e M(object), ou M2(string) e M2(string?).
  • Os tipos de parâmetro correspondentes diferem apenas no modificador de referência. Por exemplo, M(ref int) e M(out int).
  • Você incluiu um init e um set acessador para uma propriedade.

Nenhuma sobrecarga encontrada

  • CS1501 - Nenhuma sobrecarga para o método 'method' leva argumentos 'number'
  • CS1928 - 'Type' não contém uma definição para 'method' e o melhor 'method' de sobrecarga de método de extensão tem alguns argumentos inválidos.
  • CS1929 - 'TypeA' não contém uma definição para 'method' e a melhor sobrecarga de método de extensão 'TypeB.method' requer um receptor do tipo 'TypeC'

Seu código chama um método em que o nome existe, mas alguns argumentos estão incorretos ou você usou o número errado de argumentos. Se você estiver tentando chamar um método de extensão, a classe que contém pode estar em um namespace que não é importado.

Observação

O erro CS1928 não é usado pelos compiladores mais recentes. Os compiladores mais recentes usam CS1929 exclusivamente.

Sobrecargas ambíguas

  • CS0034 - O operador é ambíguo em operandos do tipo 'type1' and 'type2'
  • CS0035 - O operador é ambíguo em um operando do tipo 'type'
  • CS0121 - A chamada é ambígua entre os seguintes métodos ou propriedades
  • CS0457 - Conversões ambíguas definidas pelo usuário ao converter de 'type1' para 'type2'
  • CS8315 - O operador é ambíguo em operandos

Esses erros indicam que não há uma sobrecarga melhor do que outras. Há várias causas possíveis para esses erros:

  • Argumentos diferentes são melhores para cada parâmetro. Um pode ser uma correspondência exata e o outro requer uma conversão:

      void M(int a, double b) {    }
      void M(double a, int b) {}
    
      M(1, 1); // ambiguous
    
  • Vários operadores de conversão definidos pelo usuário são candidatos. Os operadores de conversão podem ser declarados no tipo de origem, seus tipos base, o tipo de destino ou seus tipos base. Se um operador de conversão foi definido em mais de um, o compilador não pode escolher.

  • Vários operadores de conversão podem executar uma conversão compatível.

  • Um ou mais argumentos usam default (não default(T)) e vários tipos podem ser escolhidos.

Na maioria desses casos, adicionar uma conversão explícita pode especificar qual sobrecarga deve ser escolhida.

Prioridade de resolução de sobrecarga

  • CS9261 - Não é possível usar 'OverloadResolutionPriorityAttribute' em um membro de substituição.
  • CS9262 - Não é possível usar 'OverloadResolutionPriorityAttribute' neste membro.

Seu código violou as regras para usar o OverloadResolutionPriorityAttribute para favorecer uma sobrecarga em vez de outra. Você não pode aplicar o OverloadResolutionPriorityAttribute aos seguintes tipos de método:

  • Propriedades não indexadoras
  • Acessadores de propriedade, indexador ou evento
  • Operadores de conversão
  • Lambdas
  • Funções locais
  • Finalizadores
  • Construtores estáticos

Além disso, você não pode aplicar o OverloadResolutionPriorityAttribute a um membro override de um virtual ou abstract. O compilador usa o valor da declaração de tipo base.