Partilhar via


Incompatibilidade de parâmetros e argumentos

O compilador gera os seguintes erros quando não há nenhum argumento fornecido para um parâmetro formal, ou o argumento não é válido para esse parâmetro:

  • CS0182: Um argumento de atributo deve ser uma expressão constante, typeof expressão ou expressão de criação de matriz de um tipo de parâmetro de atributo
  • CS0591: Valor inválido para o argumento a atribuir
  • CS0599: Valor inválido para o argumento de atributo nomeado 'argumento'
  • CS0617: Não é um argumento de atributo nomeado válido. Os argumentos de atributo nomeado devem ser campos que não são somente leitura, estáticos ou const, ou propriedades de leitura-gravação que são públicas e não estáticas.
  • CS0633: O argumento para o atributo deve ser um identificador válido
  • CS0643: Argumento de atributo nomeado duplicado
  • CS0655: Não é um argumento de atributo nomeado válido porque não é um tipo de parâmetro de atributo válido
  • CS0839: Argumento ausente.
  • CS1016: Argumento de atributo nomeado esperado
  • CS1739: A melhor sobrecarga para não tem um parâmetro chamado
  • CS1740: Argumento nomeado não pode ser especificado várias vezes
  • CS1742: Um acesso à matriz pode não ter um especificador de argumento nomeado
  • CS1744: Argumento nomeado especifica um parâmetro para o qual um argumento posicional já foi dado
  • CS1746: O delegado não tem um parâmetro chamado 'nome'
  • CS7036: Não há nenhum argumento dado que corresponde ao parâmetro necessário
  • CS7067: O parâmetro do construtor Attribute é opcional, mas nenhum valor de parâmetro padrão foi especificado.
  • CS8324: As especificações de argumento nomeado devem aparecer depois que todos os argumentos fixos tiverem sido especificados em uma chamada dinâmica.
  • CS8905: Um ponteiro de função não pode ser chamado com argumentos nomeados.
  • CS8943: null não é um nome de parâmetro válido. Para obter acesso ao recetor de um método de instância, use a cadeia de caracteres vazia como o nome do parâmetro.
  • CS8944: Método não é um método de instância, o recetor não pode ser um argumento de manipulador de cadeia de caracteres interpolado.
  • CS8945: Não é um nome de parâmetro válido.
  • CS8948: InterpolatedStringHandlerArgumentAttribute os argumentos não podem se referir ao parâmetro no qual o atributo é usado.
  • CS8949: O InterpolatedStringHandlerArgumentAttribute parâmetro aplicado é malformado e não pode ser interpretado. Construa uma instância dele manualmente.
  • CS8950: Parâmetro é um argumento para a conversão do manipulador de cadeia de caracteres interpolada no parâmetro, mas o argumento correspondente é especificado após a expressão de cadeia de caracteres interpolada. Reordene os argumentos.
  • CS8951: O parâmetro não é fornecido explicitamente, mas é usado como um argumento para a conversão do manipulador de cadeia de caracteres interpolado no parâmetro.
  • CS8964: O CallerArgumentExpressionAttribute só pode ser aplicado a parâmetros com valores padrão
  • CS8965: O CallerArgumentExpressionAttribute aplicado ao parâmetro não terá efeito porque é autorreferencial.
  • CS8966: O CallerArgumentExpressionAttribute não terá efeito porque se aplica a um membro que é usado em contextos que não permitem argumentos opcionais

Argumento em falta

Os seguintes erros gerais são emitidos quando o compilador não pode corresponder argumentos a todos os parâmetros de membro:

  • CS0839: Argumento ausente.
  • CS7036: Não há nenhum argumento dado que corresponde ao parâmetro necessário

Esses erros são gerais: O compilador não pode corresponder os argumentos fornecidos em uma chamada de método para os parâmetros necessários do método. Verifique as seguintes causas:

  • Certifique-se de que incluiu todos os argumentos necessários.
  • Verifique se os argumentos estão na ordem correta.
  • Certifique-se de que todos os argumentos são do tipo correto.
  • Certifique-se de que as regras de resolução de sobrecarga escolheram o método esperado.

Você também pode ver CS7036 se você escreveu funções locais sobrecarregadas. As funções locais não podem ser sobrecarregadas. O compilador só reconhece a primeira função local com esse nome. Verifique se você pretendia chamar uma função local diferente.

Esses erros geralmente aparecem com outros diagnósticos que podem ajudar a diagnosticar a causa correta.

Argumentos para atributos

O compilador emite esses erros quando um argumento para um construtor de atributo está incorreto:

  • CS0182: Um argumento de atributo deve ser uma expressão constante, typeof expressão ou expressão de criação de matriz de um tipo de parâmetro de atributo
  • CS0591: Valor inválido para o argumento a atribuir
  • CS0599: Valor inválido para o argumento de atributo nomeado 'argumento'
  • CS0617: Não é um argumento de atributo nomeado válido. Os argumentos de atributo nomeado devem ser campos que não são somente leitura, estáticos ou const, ou propriedades de leitura-gravação que são públicas e não estáticas.
  • CS0633: O argumento para o atributo deve ser um identificador válido
  • CS0643: Argumento de atributo nomeado duplicado
  • CS0655: não é um argumento de atributo nomeado válido porque não é um tipo de parâmetro de atributo válido

Se você usar a System.AttributeUsageAttribute definição de atributo on, verifique se os valores permitidos não são mutuamente exclusivos. Verifique se o tipo e a ordem dos argumentos para o atributo estão corretos. Verifique se o texto dos argumentos da cadeia de caracteres é válido. Para muitos atributos, o argumento deve ser um identificador C# válido. Os argumentos para atribuir construtores devem ser constantes de tempo de compilação. Portanto, eles são limitados a tipos que suportam constantes literais. Além disso, os seguintes tipos que permitem constantes literais não são permitidos como parâmetros de atributo:

Não é possível especificar argumentos nomeados repetidos com o mesmo nome de parâmetro. Você só pode definir propriedades acessíveis ao inicializar um atributo. Não é possível definir propriedades privadas.

Parâmetros e argumentos nomeados e opcionais

O compilador emite os seguintes erros para o uso incorreto de argumentos nomeados e opcionais:

  • CS1016: Argumento de atributo nomeado esperado
  • CS1739: A melhor sobrecarga para não tem um parâmetro chamado
  • CS1740: Argumento nomeado não pode ser especificado várias vezes
  • CS1742: Um acesso à matriz pode não ter um especificador de argumento nomeado
  • CS1744: Argumento nomeado especifica um parâmetro para o qual um argumento posicional já foi dado
  • CS1746: O delegado não tem um parâmetro chamado 'nome'
  • CS7067: O parâmetro do construtor Attribute é opcional, mas nenhum valor de parâmetro padrão foi especificado.
  • CS8324: As especificações de argumento nomeado devem aparecer depois que todos os argumentos fixos tiverem sido especificados em uma chamada dinâmica.
  • CS8905: Um ponteiro de função não pode ser chamado com argumentos nomeados.

Verifique as seguintes causas desses erros:

  • O nome do parâmetro do argumento nomeado está incorreto.
  • A sobrecarga escolhida não tem um parâmetro correspondente ao argumento nomeado.
  • Um nome de parâmetro é repetido em mais de um argumento.
  • Um argumento posicional (sem nome) aparece após argumentos nomeados.
  • Argumentos nomeados não são permitidos para parâmetros de índice de matriz.

Manipulador de cadeia de caracteres interpolado

O compilador emite os seguintes erros quando você especificou um manipulador de cadeia de caracteres interpolado incorretamente.

  • CS8943: null não é um nome de parâmetro válido. Para obter acesso ao recetor de um método de instância, use a cadeia de caracteres vazia como o nome do parâmetro.
  • CS8944: Não é um método de instância, o recetor não pode ser um argumento de manipulador de cadeia de caracteres interpolado.
  • CS8945: Não é um nome de parâmetro válido.
  • CS8948: InterpolatedStringHandlerArgumentAttribute os argumentos não podem se referir ao parâmetro no qual o atributo é usado.
  • CS8949: O InterpolatedStringHandlerArgumentAttribute parâmetro aplicado é malformado e não pode ser interpretado. Construa uma instância manualmente.
  • CS8950: Parâmetro é um argumento para a conversão do manipulador de cadeia de caracteres interpolada no parâmetro, mas o argumento correspondente é especificado após a expressão de cadeia de caracteres interpolada.
  • CS8951: O parâmetro não é fornecido explicitamente, mas é usado como um argumento para a conversão do manipulador de cadeia de caracteres interpolado no parâmetro.

Um manipulador de cadeia de caracteres interpolado é uma construção baseada em padrão. É importante corrigir o padrão. Consulte a especificação do recurso ou siga o tutorial sobre como criar um manipulador de cadeia de caracteres interpolado.

Informações de depuração do chamador

O compilador emite o seguinte erro em um uso incorreto do System.Runtime.CompilerServices.CallerArgumentExpressionAttribute:

  • CS8964: O CallerArgumentExpressionAttribute só pode ser aplicado a parâmetros com valores padrão

Além disso, o compilador emite os seguintes avisos sobre um uso incorreto do CallerArgumentExpressionAttribute:

  • CS8965: O CallerArgumentExpressionAttribute aplicado ao parâmetro não terá efeito porque é autorreferencial.
  • CS8966: O CallerArgumentExpressionAttribute não terá efeito porque se aplica a um membro que é usado em contextos que não permitem argumentos opcionais

Qualquer parâmetro anotado com o CallerArgumentExpression atributo deve ter um valor padrão.