Partilhar via


Resolver erros e avisos relacionados a declarações de atributo ou uso de atributo em seu código

Este artigo aborda os seguintes erros do compilador:

  • CS0181: O parâmetro construtor de atributo tem um tipo, que não é um tipo válido de parâmetro de atributo
  • CS0243: O atributo Conditional não é válido em 'method' porque é um método de substituição.
  • CS0404: O atributo não é válido neste tipo de declaração.
  • CS0415: Este atributo é válido somente em um indexador que não é uma declaração explícita de membro da interface.
  • CS0416: 'type parameter': um argumento de atributo não pode usar parâmetros type.
  • CS0447: O atributo não pode ser usado com argumentos de tipo.
  • CS0577: O atributo Conditional não é válido porque é um construtor, destruidor, operador, expressão lambda ou implementação de interface explícita.
  • CS0578: O atributo Conditional não é válido em 'function' porque seu tipo de retorno não é nulo.
  • CS0579: Atributo duplicado
  • CS0582: O atributo Conditional não é válido em membros da interface.
  • CS0592: O atributo não é válido neste tipo de declaração. Só é válido em declarações específicas.
  • CS0609: Não é possível definir o atributo em um indexador marcado substituição.
  • CS0616: O tipo não é uma classe de atributos
  • CS0625: O campo de instância em tipos marcados com StructLayout(LayoutKind.Explicit) deve ter um atributo FieldOffset.
  • CS0629: O membro condicional 'membro' não pode implementar o membro da interface 'membro da classe base' no tipo 'Nome do Tipo'.
  • CS0636: O atributo FieldOffset só pode ser colocado em membros de tipos marcados com o StructLayout(LayoutKind.Explicit).
  • CS0637: O atributo FieldOffset não é permitido em campos estáticos ou const.
  • CS0641: Este atributo só é válido em classes derivadas de System.Attribute'.
  • CS0646: Não é possível especificar o atributo DefaultMember em um tipo que contém um indexador.
  • CS0647: Atributo emissor de erro
  • CS0653: Não é possível aplicar a classe de atributo 'classe' porque é abstrato.
  • CS0657: Local não é um local de atributo válido para esta declaração. Os locais de atributos válidos para esta declaração são listados. Todos os atributos neste bloco serão ignorados.
  • CS0658: Localização não é um local de atributo reconhecido. Os locais de atributos válidos para esta declaração são listados. Todos os atributos neste bloco serão ignorados.
  • CS0668: Dois indexadores têm nomes diferentes; o atributo IndexerName deve ser usado com o mesmo nome em todos os indexadores dentro de um tipo
  • CS0685: O membro condicional 'membro' não pode ter um parâmetro de saída.
  • CS0735: Tipo inválido especificado como argumento para o atributo TypeForwardedTo
  • CS0739: Tipo DuplicadoEncaminhadoParaAtributo
  • CS1608: O atributo RequiredAttribute não é permitido nos tipos C#
  • CS1614: O nome do atributo é ambíguo. Use '@name' ou inclua explicitamente o sufixo 'Attribute'.
  • CS1618: Não é possível criar delegate a partir de um método porque este ou um método que ele sobrepõe tem um atributo Condicional
  • CS1667: O atributo não é válido em propriedades ou acessórios de eventos. Só é válido em declarações específicas.
  • CS1689: Atributo é válido apenas em métodos ou classes de atributos
  • CS7014: Os atributos não são válidos neste contexto.
  • CS7046: O parâmetro de atributo deve ser especificado.
  • CS7047: O parâmetro de atributo 'parameter1' ou 'parameter2' deve ser especificado.
  • CS7067: O parâmetro do construtor Attribute é opcional, mas nenhum valor de parâmetro padrão foi especificado.
  • CS8959: O atributo CallerArgumentExpressionExpression não pode ser aplicado porque não existem conversões padrão do tipo1 para o tipo2
  • CS8960: O atributo CallerArgumentExpression aplicado ao parâmetro não terá efeito. É sobreposto pelo atributo CallerLineNumber.
  • CS8961: O atributo CallerArgumentExpression aplicado ao parâmetro não terá efeito. É sobreposto pelo AtributoCaminhoDeArquivoDoChamador.
  • CS8962: O atributo CallerArgumentExpression aplicado ao parâmetro não terá efeito. É sobreposto pelo atributo CallerMemberName.
  • CS8963: O atributo CallerArgumentExpressionApplied aplicado ao parâmetro não terá efeito. É aplicado com um nome de parâmetro inválido.
  • CS8968: Um argumento de tipo de atributo não pode usar parâmetros de tipo
  • CS8970: O tipo não pode ser usado neste contexto porque não pode ser representado em metadados.
  • CS9331: O atributo não pode ser aplicado manualmente.

Argumentos e parâmetros de atributos

Vês os seguintes erros quando usas incorretamente argumentos ou parâmetros de atributo:

  • CS0181: O parâmetro construtor de atributo tem um tipo, que não é um tipo válido de parâmetro de atributo
  • CS0416: 'type parameter': um argumento de atributo não pode usar parâmetros type.
  • CS0447: O atributo não pode ser usado com argumentos de tipo.
  • CS0647: Atributo emissor de erro
  • CS7046: O parâmetro de atributo deve ser especificado.
  • CS7047: O parâmetro de atributo 'parameter1' ou 'parameter2' deve ser especificado.
  • CS7067: O parâmetro do construtor Attribute é opcional, mas nenhum valor de parâmetro padrão foi especificado.
  • CS8968: Um argumento de tipo de atributo não pode usar parâmetros de tipo
  • CS8970: O tipo não pode ser usado neste contexto porque não pode ser representado em metadados.

Para corrigir estes erros, siga estas regras:

  • Os parâmetros do construtor de atributos devem usar tipos válidos de parâmetros de atributo (CS0181). A especificação da linguagem C# restringe os tipos de parâmetros de atributo a tipos primitivos (bool, byte, char, double, float, int, long, short, string), object, System.Type, tipos de enum e arrays unidimensionais desses tipos. Ponteiros de função e outros tipos que não podem ser representados em metadados não são tipos válidos de parâmetros de atributo.
  • Os argumentos dos atributos devem ser valores constantes em tempo de compilação, por isso não podes usar parâmetros de tipo como argumentos de atributos (CS0416). O compilador deve resolver argumentos de atributos em tempo de compilação, e os parâmetros do tipo não são conhecidos até que o tipo genérico seja construído.
  • Não podes aplicar argumentos de tipo a um atributo não genérico (CS0447). Se uma classe de atributo não for genérica, a sua utilização não pode incluir argumentos de tipo em colchetes angulares.
  • Todos os valores passados a um construtor de atributos devem estar corretamente formatados e dentro do intervalo válido para cada parâmetro (CS0647). Por exemplo, a GuidAttribute requer uma cadeia válida de formato GUID.
  • Deve fornecer todos os parâmetros de atributo necessários quando aplicar o atributo (CS7046, CS7047). Verifique a assinatura do construtor do atributo para determinar quais os parâmetros obrigatórios e forneça argumentos válidos para cada parâmetro.
  • Quando defines um atributo personalizado com parâmetros de construtor opcionais, especifica valores padrão para esses parâmetros (CS7067). Use a sintaxe parameterType parameterName = defaultValue no construtor de atributos para que os chamadores possam omitir esses argumentos.
  • Argumentos genéricos de tipo de atributo devem ser tipos concretos, não parâmetros de tipo (CS8968). O compilador deve determinar completamente os argumentos genéricos do tipo de atributo em tempo de compilação, pelo que parâmetros de tipo aberto não são permitidos.
  • Os tipos usados como argumentos de atributos devem ser representáveis em metadados (CS8970). Alguns tipos construídos, como os que envolvem dynamic ou certos nomes de elementos de tuplas, não podem ser codificados em metadados e não são permitidos como argumentos de tipo de atributo.

Para mais informações, consulte Atributos, Genéricos e a secção de especificação da linguagem C# sobre atributos.

Observação

CS0447 e CS0647 estão obsoletos. O compilador atual não emite estes erros.

Requisitos de classe de atributo

Vê os seguintes erros quando define classes de atributos que não cumprem as restrições exigidas:

  • CS0404: O atributo não é válido neste tipo de declaração.
  • CS0579: Atributo duplicado
  • CS0616: O tipo não é uma classe de atributos
  • CS0641: Este atributo só é válido em classes derivadas de System.Attribute'.
  • CS0653: Não é possível aplicar a classe de atributo 'classe' porque é abstrata.
  • CS1614: O nome do atributo é ambíguo. Use '@name' ou inclua explicitamente o sufixo 'Attribute'.

Para corrigir estes erros, siga estas regras:

  • Aplicar atributos apenas aos tipos de declaração que o atributo AttributeUsageAttribute permite (CS0404). Verifique o valor especificado em AttributeTargets do atributo AttributeUsage para ver quais alvos são válidos.
  • Se aplicares o mesmo atributo mais do que uma vez a um único alvo, remove o duplicado ou define AllowMultiple = true o atributo AttributeUsageAttribute (CS0579). Por defeito, os atributos só podem aparecer uma vez em cada alvo.
  • O tipo usado na sintaxe de atributos deve herdar de System.Attribute (CS0616). Apenas classes derivadas de System.Attribute podem ser usadas como atributos. Outros tipos causam este erro mesmo que tenham nomes semelhantes.
  • Pode aplicar AttributeUsageAttribute apenas a classes que derivam de Attribute (CS0641). O AttributeUsage atributo controla como outros atributos são usados e está restrito a classes de atributos.
  • As classes de atributos não podem existir abstract porque o compilador tem de as instanciar (CS0653). Remover o abstract modificador da classe de atributo ou derivar uma classe concreta a partir da base abstrata.
  • Quando existem tanto as classes de atributos Example quanto ExampleAttribute, o compilador não consegue determinar a qual [Example] se refere (CS1614). Desambigue usando [@Example] para o nome mais curto ou [ExampleAttribute] para o nome mais longo.

Para mais informações, consulte Criar atributos personalizados e a secção de especificação da linguagem C# sobre atributos.

Contexto da localização do atributo

Os seguintes erros ocorrem quando se aplicam atributos em locais inválidos ou se utilizam especificadores de alvo incorretos:

  • CS0592: O atributo não é válido neste tipo de declaração. Só é válido em declarações específicas.
  • CS0657: Local não é um local de atributo válido para esta declaração. Os locais de atributos válidos para esta declaração são listados. Todos os atributos neste bloco serão ignorados.
  • CS0658: Localização não é um local de atributo reconhecido. Os locais de atributos válidos para esta declaração são listados. Todos os atributos neste bloco serão ignorados.
  • CS1667: O atributo não é válido em propriedades ou acessórios de eventos. Só é válido em declarações específicas.
  • CS7014: Os atributos não são válidos neste contexto.

Para corrigir esses erros, siga estas regras. Para mais informações, consulte Alvos de Atributos e a secção de especificação da linguagem C# sobre especificação de atributos.

  • Cada atributo AttributeUsageAttribute especifica que tipos de declaração tem como alvo. Deve aplicar o atributo apenas a esses tipos (CS0592). Por exemplo, não podes aplicar um atributo definido com AttributeTargets.Interface a uma classe.
  • Quando utiliza um especificador de alvo de atributos como method: ou property:, o especificador deve ser válido para a declaração onde aparece (CS0657). Verifique a mensagem de erro para ver quais os especificadores de alvo permitidos para a declaração específica.
  • O especificador de alvo de atributos que usaste não é um especificador reconhecido (CS0658). Os especificadores válidos incluem assembly:, module:, type:, , method:property:, field:, event:, param:e return:.
  • Alguns atributos, como ObsoleteAttribute e CLSCompliantAttribute, não são válidos em propriedades ou acessórios de eventos (CS1667). Mover o atributo do acessório para a própria declaração de propriedade ou evento.
  • Os atributos só podem aparecer em elementos do programa que os suportam (CS7014). Se estiveres a aplicar atributos a nível assembly ou nível de módulo, usa os especificadores assembly: ou module: alvo e coloca-os no topo do ficheiro.

Atributos predefinidos

Os seguintes erros ocorrem quando você usa atributos .NET predefinidos específicos incorretamente:

  • CS0415: Este atributo é válido somente em um indexador que não é uma declaração explícita de membro da interface.
  • CS0609: Não é possível definir o atributo em um indexador marcado substituição.
  • CS0625: O campo de instância em tipos marcados com StructLayout(LayoutKind.Explicit) deve ter um atributo FieldOffset.
  • CS0636: O atributo FieldOffset só pode ser colocado em membros de tipos marcados com o StructLayout(LayoutKind.Explicit).
  • CS0637: O atributo FieldOffset não é permitido em campos estáticos ou const.
  • CS0646: Não é possível especificar o atributo DefaultMember em um tipo que contém um indexador.
  • CS0668: Dois indexadores têm nomes diferentes; o atributo IndexerName deve ser usado com o mesmo nome em todos os indexadores dentro de um tipo
  • CS0735: Tipo inválido especificado como argumento para o atributo TypeForwardedTo
  • CS0739: Tipo DuplicadoEncaminhadoParaAtributo
  • CS1608: O atributo RequiredAttribute não é permitido nos tipos C#
  • CS9331: O atributo não pode ser aplicado manualmente.

Para corrigir esses erros, siga estas regras. Para mais informações, veja Indexadores, Tipos de Estrutura, TypeForwardedToAttribute, e Invocação de Plataforma (P/Invocação).

  • IndexerNameAttribute pode ser aplicado a indexadores que não sejam declarações explícitas de membros de interface (CS0415). Remover o atributo dos indexadores de interface explícitos, porque a interface já define o nome do indexador.
  • Não é possível aplicar IndexerName a indexadores marcados com override porque os indexadores sobrepostos herdam o nome da classe base (CS0609). Remova o atributo IndexerName do indexador de substituição.
  • Cada campo de instância num tipo marcado com StructLayout(LayoutKind.Explicit) deve ter um FieldOffsetAttribute (CS0625). O layout explícito exige que especifique o deslocamento em bytes para cada campo de instância.
  • Só se pode colocar FieldOffsetAttribute em membros de tipos que tenham StructLayoutAttribute definido como LayoutKind.Explicit (CS0636). Adicione o StructLayout atributo à declaração do tipo que contém.
  • O atributo FieldOffset não é permitido nos campos static ou const porque o layout explícito aplica-se apenas a campos de instância (CS0637). Remova o FieldOffset atributo do campo estático ou const.
  • Não podes aplicar DefaultMemberAttribute a um tipo que já contém um indexador porque o compilador define automaticamente o membro padrão para tipos com indexadores (CS0646). Remova o atributo DefaultMember.
  • Todos IndexerNameAttribute os atributos dentro de um tipo devem especificar o mesmo nome (CS0668). Mude os nomes para corresponder, porque o runtime usa um único nome para todos os indexadores de um tipo.
  • O tipo especificado como argumento para TypeForwardedToAttribute deve ser um tipo não genérico, não aninhado, sem ponteiro e sem array (CS0735). Apenas os tipos nomeados de nível superior são destinos de encaminhamento válidos.
  • Um conjunto pode ter apenas um TypeForwardedToAttribute para cada tipo externo (CS0739). Localiza e remove a declaração duplicada TypeForwardedTo .
  • O RequiredAttributeAttribute não é permitido em tipos definidos em C# (CS1608). Este atributo é reservado para outras linguagens que precisam de forçar compiladores a exigir uma determinada funcionalidade.
  • Alguns atributos são reservados para o compilador e não podem ser aplicados manualmente no código-fonte (CS9331). Substitua o atributo pela sintaxe equivalente da linguagem C# que faz com que o compilador o gere.

Uso de atributos condicionais

Vê-se os seguintes erros quando aplica o ConditionalAttribute de maneiras que violam as suas restrições de uso.

  • CS0243: O atributo Conditional não é válido em 'method' porque é um método de substituição.
  • CS0577: O atributo Conditional não é válido porque é um construtor, destruidor, operador, expressão lambda ou implementação de interface explícita.
  • CS0578: O atributo Conditional não é válido em 'function' porque seu tipo de retorno não é nulo.
  • CS0582: O atributo Conditional não é válido em membros da interface.
  • CS0629: Membro condicional 'membro' não pode implementar membro da interface 'membro da classe base' no tipo 'Nome do tipo'.
  • CS0685: O membro condicional 'member' não pode ter um parâmetro 'out'.
  • CS1618: Não é possível criar um delegate com o método porque ele ou um método que ele sobrepõe tem um atributo Conditional
  • CS1689: Atributo é válido apenas em métodos ou classes de atributos

Para corrigir esses erros, siga estas regras. Para mais informações, veja ConditionalAttribute, Métodos condicionais e Atributos.

  • O compilador associa chamadas à declaração do método base, não ao override, por isso não podes aplicar o Conditional atributo aos métodos de override (CS0243). Remova o Conditional atributo do método de substituição, ou remova a override palavra-chave.
  • O Conditional atributo não é válido em construtores, finalizadores, operadores, expressões lambda ou implementações explícitas de interface (CS0577). Estes tipos de membros não podem ser omitidos condicionalmente porque têm funções obrigatórias no ciclo de vida ou contrato do tipo.
  • Os métodos condicionais devem devolver void porque o compilador pode omitir completamente a chamada, e não haveria valor de retorno disponível para o chamador (CS0578). Altere o tipo de retorno do método para void, ou remova o Conditional atributo.
  • Os membros da interface não podem ser condicionais porque todos os membros da interface devem ser implementados (CS0582). Remover o Conditional atributo da declaração do membro da interface.
  • Métodos que implementam membros de interface não podem ser condicionais porque o contrato de interface exige que estejam presentes em todas as builds (CS0629). Remova o Conditional atributo do método de implementação.
  • Métodos condicionais não podem ter out parâmetros porque o out valor da variável ficaria indefinido quando o compilador omite a chamada de método (CS0685). Remova os out parâmetros do método ou remova o Conditional atributo.
  • Não podes criar um delegado que faça referência a um método condicional porque o método pode não existir em builds onde o símbolo de condição não está definido (CS1618). Remove o Conditional atributo do método, ou não o uses como alvo de delegado.
  • O Conditional atributo só é válido em métodos e classes de atributos (CS1689). Não é válido para outros tipos de declaração, como classes não-atributos, structs ou interfaces.

Utilização do atributo CallerArgumentExpression

Os seguintes erros ocorrem quando aplica CallerArgumentExpressionAttribute incorretamente ou entra em conflito com outros atributos de informação do chamador:

  • CS8959: O atributo CallerArgumentExpressionExpression não pode ser aplicado porque não existem conversões padrão do tipo1 para o tipo2
  • CS8960: O atributo CallerArgumentExpression aplicado ao parâmetro não terá efeito. É sobreposto pelo CallerLineNumberAttribute.
  • CS8961: O atributo CallerArgumentExpression aplicado ao parâmetro não terá efeito. É sobreposto pelo CallerFilePathAttribute.
  • CS8962: O atributo CallerArgumentExpression aplicado ao parâmetro não terá efeito. É substituído pelo CallerMemberNameAttribute.
  • CS8963: O atributo CallerArgumentExpressionApplied aplicado ao parâmetro não terá efeito. É aplicado com um nome de parâmetro inválido.

Para corrigir esses erros, siga estas regras. Para mais informações, veja Atributos de informação do Chamador e CallerArgumentExpressionAttribute.

  • O parâmetro decorado com CallerArgumentExpression deve ter um tipo string ou um tipo com uma conversão padrão de string, porque o atributo injeta uma string representação da expressão argumental do chamador (CS8959). Muda o tipo de parâmetro para string ou um tipo compatível.
  • O atributo CallerArgumentExpression não tem efeito sobre um parâmetro que também tenha CallerLineNumberAttribute, CallerFilePathAttribute, ou CallerMemberNameAttribute (CS8960, CS8961, CS8962). Esses atributos do caller info têm prioridade, por isso remove o CallerArgumentExpression atributo do parâmetro.
  • O argumento da cadeia passado ao CallerArgumentExpression construtor deve corresponder ao nome de outro parâmetro na mesma assinatura de método (CS8963). Se o nome do parâmetro estiver escrito incorretamente ou se referir a um parâmetro inexistente, o atributo não tem efeito.