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
eout
. - 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
ouout
, 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
eout
. - 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
ouout
, 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)
eM(object)
, ouM2(string)
eM2(string?)
. - Os tipos de parâmetro correspondentes diferem apenas no modificador de referência. Por exemplo,
M(ref int)
eM(out int)
. - Você incluiu um
init
e umset
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ãodefault(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.