Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo aborda os seguintes erros do compilador:
- CS0181: o parâmetro do construtor de atributo tem um tipo, que não é um tipo de parâmetro de atributo válido
- CS0243: o atributo condicional não é válido em 'method' porque é um método de substituição.
- CS0404: o atributo não é válido nesse tipo de declaração.
- CS0415: esse atributo é válido apenas em um indexador que não seja uma declaração de membro de interface explícita.
- CS0416: 'type parameter': um argumento de atributo não pode usar parâmetros de tipo.
- CS0447: O atributo não pode ser usado com argumentos de tipo.
- CS0577: O atributo condicional não é válido porque é um construtor, destruidor, operador, expressão lambda ou implementação de interface explícita.
- CS0578: O atributo condicional não é válido em 'função' porque seu tipo de retorno não é nulo.
- CS0579: atributo duplicado
- CS0582: O atributo condicional não é válido em membros da interface.
- CS0592: o atributo não é válido nesse tipo de declaração. Ela só é válida em declarações específicas.
- CS0609: Não é possível definir o atributo em um indexador marcado como substituição.
- CS0616: O tipo não é uma classe de atributo
- CS0625: o campo de instância em tipos marcados com StructLayout(LayoutKind.Explicit) deve ter um atributo FieldOffset.
- CS0629: o membro condicional 'member' não pode implementar o membro da interface 'membro de 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: esse 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: Erro ao emitir atributo
- CS0653: Não é possível aplicar a classe de atributo 'class' porque ela é abstrata.
- CS0657: o local não é um local de atributo válido para essa declaração. Os locais de atributo válidos para essa declaração estão listados. Todos os atributos neste bloco serão ignorados.
- CS0658: o local não é um local de atributo reconhecido. Os locais de atributo válidos para essa declaração estã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 cada indexador dentro de um tipo
- CS0685: o membro condicional 'member' não pode ter um parâmetro out.
- CS0735: tipo inválido especificado como um argumento para o atributo TypeForwardedTo
- CS0739: TypeForwardedToAttribute duplicado
- CS1608: O atributo RequiredAttribute não é permitido em tipos C#
- CS1614: O nome do atributo é ambíguo. Use '@name' ou inclua explicitamente o sufixo 'Attribute'.
- CS1618: Não é possível criar delegado com o método porque ele ou um método que ele substitui tem um atributo condicional
- CS1667: o atributo não é válido em acessadores de propriedade ou evento. Ela só é válida em declarações específicas.
- CS1689: O atributo só é válido em métodos ou classes de atributo
- 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 de atributo é opcional, mas nenhum valor de parâmetro padrão foi especificado.
- CS8959: CallerArgumentExpressionAttribute não pode ser aplicado porque não há conversões padrão de type1 para type2
- CS8960: O CallerArgumentExpressionAttribute aplicado ao parâmetro não terá efeito. Ele é substituído pelo CallerLineNumberAttribute.
- CS8961: o CallerArgumentExpressionAttribute aplicado ao parâmetro não terá efeito. Ele é substituído pelo CallerFilePathAttribute.
- CS8962: O CallerArgumentExpressionAttribute aplicado ao parâmetro não terá efeito. Ele é substituído pelo CallerMemberNameAttribute.
- CS8963: O CallerArgumentExpressionAttribute aplicado ao parâmetro não terá efeito. Ele é 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 nesse contexto porque não pode ser representado em metadados.
- CS9331: O atributo não pode ser aplicado manualmente.
Argumentos e parâmetros de atributo
Você verá os seguintes erros ao usar argumentos de atributo ou parâmetros incorretamente:
- CS0181: o parâmetro do construtor de atributo tem um tipo, que não é um tipo de parâmetro de atributo válido
- CS0416: 'type parameter': um argumento de atributo não pode usar parâmetros de tipo.
- CS0447: O atributo não pode ser usado com argumentos de tipo.
- CS0647: Erro ao emitir atributo
- 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 de atributo é 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 nesse contexto porque não pode ser representado em metadados.
Para corrigir esses erros, siga estas regras:
- Os parâmetros do construtor de atributo devem usar tipos de parâmetro de atributo válidos (CS0181). A especificação da linguagem C# restringe os tipos de parâmetro de atributo a tipos primitivos (
bool, ,byte,chardouble, ,float,int,longshortestring),object, ,System.Typetipos de enumeração e matrizes unidimensionais desses tipos. Ponteiros de função e outros tipos que não podem ser representados em metadados não são tipos de parâmetro de atributo válidos. - Os argumentos de atributo devem ser valores constantes de tempo de compilação, portanto, você não pode usar parâmetros de tipo como argumentos de atributo (CS0416). O compilador deve resolver argumentos de atributo no tempo de compilação e os parâmetros de tipo não são conhecidos até que o tipo genérico seja construído.
- Não é possível aplicar argumentos de tipo a um atributo não genérico (CS0447). Se uma classe de atributo não for genérica, seu uso não poderá incluir argumentos de tipo em colchetes angulares.
- Todos os valores passados para um construtor de atributo devem ser formatados corretamente e dentro do intervalo válido para cada parâmetro (CS0647). Por exemplo, um GuidAttribute requer uma cadeia de caracteres de formato GUID válida.
- Você deve fornecer todos os parâmetros de atributo necessários ao aplicar o atributo (CS7046, CS7047). Verifique a assinatura do construtor do atributo para determinar quais parâmetros são obrigatórios e forneça argumentos válidos para cada parâmetro.
- Quando você define um atributo personalizado com parâmetros de construtor opcionais, especifique valores padrão para esses parâmetros (CS7067). Use a sintaxe
parameterType parameterName = defaultValueno construtor de atributos para que os chamadores possam omitir esses argumentos. - Argumentos de tipo de atributo genérico devem ser tipos concretos, não parâmetros de tipo (CS8968). O compilador deve determinar totalmente os argumentos de tipo de atributo genéricos em tempo de compilação, portanto, os parâmetros de tipo aberto não são permitidos.
- Os tipos usados como argumentos de atributo devem ser representáveis em metadados (CS8970). Alguns tipos construídos, como aqueles que envolvem
dynamicou determinados nomes de elementos de tupla, não podem ser codificados em metadados e não são permitidos como argumentos de tipo de atributo.
Para obter mais informações, consulte a seção Atributos, Genéricos e a seção de especificação da linguagem C# em atributos.
Observação
CS0447 e CS0647 foram preteridos. O compilador atual não emite esses erros.
Requisitos de classe de atributo
Você verá os seguintes erros ao definir classes de atributo que não atendem às restrições necessárias:
- CS0404: o atributo não é válido nesse tipo de declaração.
- CS0579: atributo duplicado
- CS0616: O tipo não é uma classe de atributo
- CS0641: esse atributo só é válido em classes derivadas de System.Attribute'.
- CS0653: Não é possível aplicar a classe de atributo 'class' porque ela é abstrata.
- CS1614: O nome do atributo é ambíguo. Use '@name' ou inclua explicitamente o sufixo 'Attribute'.
Para corrigir esses erros, siga estas regras:
- Aplique atributos somente aos tipos de declaração que o atributo AttributeUsageAttribute permite (CS0404). Verifique o
AttributeTargetsvalor especificado no atributoAttributeUsagepara ver quais destinos são válidos. - Se você aplicar o mesmo atributo mais de uma vez a um único destino, remova a duplicata ou defina
AllowMultiple = trueno AttributeUsageAttribute (atributo ). Por padrão, os atributos só podem aparecer uma vez em cada destino. - O tipo usado na sintaxe de atributo deve herdar de System.Attribute (CS0616). Somente classes derivadas de
System.Attributepodem ser usadas como atributos. Outros tipos causam esse erro mesmo que tenham um nome semelhante. - Você pode aplicar AttributeUsageAttribute somente às classes que derivam de
Attribute(CS0641). OAttributeUsageatributo controla como outros atributos são usados e é restrito a classes de atributo. - As classes de atributo não podem ser
abstractporque o compilador deve instanciá-las (CS0653). Remova oabstractmodificador da classe de atributo ou derive uma classe concreta da base abstrata. - Quando tanto
ExamplequantoExampleAttributesão classes de atributo, o compilador não pode determinar a qual delas[Example]se refere (CS1614). Disambiguate usando[@Example]para o nome mais curto ou[ExampleAttribute]para o nome mais longo.
Para obter mais informações, consulte Criar atributos personalizados e a seção de especificação da linguagem C# em atributos.
Contexto de localização do atributo
Os seguintes erros ocorrem quando você aplica atributos em locais inválidos ou usa especificadores de destino incorretos:
- CS0592: o atributo não é válido nesse tipo de declaração. Ela só é válida em declarações específicas.
- CS0657: o local não é um local de atributo válido para essa declaração. Os locais de atributo válidos para essa declaração estão listados. Todos os atributos neste bloco serão ignorados.
- CS0658: o local não é um local de atributo reconhecido. Os locais de atributo válidos para essa declaração estão listados. Todos os atributos neste bloco serão ignorados.
- CS1667: o atributo não é válido em acessadores de propriedade ou evento. Ela só é válida em declarações específicas.
- CS7014: Os atributos não são válidos neste contexto.
Para corrigir esses erros, siga estas regras. Para obter mais informações, consulte Destinos de Atributo e a seção de especificação da linguagem C# na especificação do atributo.
- Cada atributo especifica a que tipos de declaração AttributeUsageAttribute ele se destina. Você deve aplicar o atributo somente a esses tipos (CS0592). Por exemplo, você não pode aplicar um atributo definido com
AttributeTargets.Interfaceuma classe. - Quando você usa um especificador de destino de atributo, como
method:ouproperty:, o especificador deve ser válido para a declaração em que ele aparece (CS0657). Verifique a mensagem de erro para ver quais especificadores de destino são permitidos para a declaração específica. - O especificador de destino de atributo usado não é um especificador reconhecido (CS0658). Especificadores válidos incluem
assembly:,module:, ,type:,method:,property:,field:, ,event:,param:ereturn:. - Alguns atributos, como ObsoleteAttribute e CLSCompliantAttribute, não são válidos na propriedade ou acessadores de eventos (CS1667). Mova o atributo do acessador para a própria propriedade ou declaração de evento.
- Os atributos só podem aparecer em elementos de programa que dão suporte a eles (CS7014). Se você estiver aplicando atributos de nível de assembly ou de módulo, use os especificadores
assembly:oumodule:de destino e coloque-os na parte superior do arquivo.
Atributos predefinidos
Os seguintes erros ocorrem quando você usa atributos .NET predefinidos específicos incorretamente:
- CS0415: esse atributo é válido apenas em um indexador que não seja uma declaração de membro de interface explícita.
- CS0609: Não é possível definir o atributo em um indexador marcado como override.
- CS0625: O Campo de instância em tipos marcados por 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 cada indexador dentro de um tipo
- CS0735: tipo inválido especificado como um argumento para o atributo TypeForwardedTo
- CS0739: TypeForwardedToAttribute duplicado
- CS1608: O atributo RequiredAttribute não é permitido em tipos C#
- CS9331: O atributo não pode ser aplicado manualmente.
Para corrigir esses erros, siga estas regras. Para obter mais informações, consulte Indexadores, tiposTypeForwardedToAttribute de estrutura e Invocação de Plataforma (P/Invoke).
- Só IndexerNameAttribute pode ser aplicado a indexadores que não são declarações de membro de interface explícitas (CS0415). Remova o atributo de indexadores de interface explícitos, pois a interface já define o nome do indexador.
- Você não pode aplicar
IndexerNamea indexadores marcados comoverrideporque indexadores de substituição herdam seu nome da classe base (CS0609). Remova oIndexerNameatributo do indexador de substituição. - Cada campo de instância em um tipo marcado com
StructLayout(LayoutKind.Explicit)deve ter um FieldOffsetAttribute (CS0625). O layout explícito requer que você especifique o offset de bytes para cada campo de instância. - O FieldOffsetAttribute só pode ser colocado em membros de tipos que tenham StructLayoutAttribute definido como
LayoutKind.Explicit(CS0636). Adicione oStructLayoutatributo à declaração de tipo que contém. - O
FieldOffsetatributo não é permitido emstaticcampos ouconstporque o layout explícito se aplica somente a campos de instância (CS0637). Remova oFieldOffsetatributo do campo estático ou const. - Você não pode 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
DefaultMemberatributo. - Todos os IndexerNameAttribute atributos dentro de um tipo devem especificar o mesmo nome (CS0668). Altere os nomes para corresponder, pois o runtime usa um único nome para todos os indexadores em um tipo.
- O tipo especificado como um argumento deve TypeForwardedToAttribute ser um tipo não genérico, não aninhado, sem ponteiro, não matriz (CS0735). Somente tipos nomeados de nível superior são destinos de encaminhamento válidos.
- Um assembly pode ter apenas um TypeForwardedToAttribute para cada tipo externo (CS0739). Localize e remova a declaração duplicada
TypeForwardedTo. - RequiredAttributeAttribute não é permitido em tipos definidos em C# (CS1608). Esse atributo é reservado para outras linguagens que precisam forçar os compiladores a exigir um recurso específico.
- 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 de linguagem C# equivalente que faz com que o compilador o gere.
Uso de atributo condicional
Você verá os seguintes erros ao aplicar as ConditionalAttribute maneiras que violam suas restrições de uso:
- CS0243: o atributo condicional não é válido em 'method' porque é um método de substituição.
- CS0577: O atributo condicional não é válido porque é um construtor, destruidor, operador, expressão lambda ou implementação de interface explícita.
- CS0578: O atributo condicional não é válido em 'função' porque seu tipo de retorno não é nulo.
- CS0582: O atributo condicional não é válido em membros da interface.
- CS0629: o membro condicional 'member' não pode implementar o membro da interface 'membro de classe base' no tipo 'Nome do Tipo'.
- CS0685: O membro condicional 'member' não pode ter um parâmetro de saída.
- CS1618: Não é possível criar delegado com o método porque ele ou um método que ele substitui tem um atributo condicional
- CS1689: O atributo só é válido em métodos ou classes de atributo
Para corrigir esses erros, siga estas regras. Para obter mais informações, consulte ConditionalAttribute, métodos condicionais e atributos.
- O compilador associa chamadas à declaração do método base, não à substituição, portanto, você não pode aplicar o
Conditionalatributo para substituir métodos (CS0243). Remova oConditionalatributo do método de substituição ou remova aoverridepalavra-chave. - O
Conditionalatributo não é válido em construtores, finalizadores, operadores, expressões lambda ou implementações de interface explícitas (CS0577). Esses tipos de membro não podem ser omitidos condicionalmente porque têm funções necessárias no ciclo de vida ou no contrato do tipo. - Os métodos condicionais devem ser retornados
voidporque o compilador pode omitir totalmente a chamada e nenhum valor retornado estaria disponível para o chamador (CS0578). Altere o tipo de retorno do método paravoid, ou remova oConditionalatributo. - Os membros da interface não podem ser condicionais porque todos os membros da interface devem ser implementados (CS0582). Remova o
Conditionalatributo da declaração de membro da interface. - Os métodos que implementam membros da interface não podem ser condicionais porque o contrato de interface exige que eles estejam presentes em todos os builds (CS0629). Remova o
Conditionalatributo do método de implementação. - Métodos condicionais não podem ter
outparâmetros porque o valor daoutvariável seria indefinido quando o compilador omite a chamada de método (CS0685). Remova osoutparâmetros do método ou remova oConditionalatributo. - Não é possível criar um delegado que faça referência a um método condicional porque o método pode não existir em builds em que o símbolo de condição não está definido (CS1618). Remova o
Conditionalatributo do método ou não o use como um destino delegado. - O
Conditionalatributo só é válido em métodos e classes de atributo (CS1689). Ele não é válido em outros tipos de declaração, como classes não atributos, structs ou interfaces.
Uso do atributo CallerArgumentExpression
Os seguintes erros ocorrem quando você aplica CallerArgumentExpressionAttribute incorretamente ou em conflito com outros atributos de informações do chamador:
- CS8959: CallerArgumentExpressionAttribute não pode ser aplicado porque não há conversões padrão de type1 para type2
- CS8960: O CallerArgumentExpressionAttribute aplicado ao parâmetro não terá efeito. Ele é substituído pelo CallerLineNumberAttribute.
- CS8961: o CallerArgumentExpressionAttribute aplicado ao parâmetro não terá efeito. Ele é substituído pelo CallerFilePathAttribute.
- CS8962: O CallerArgumentExpressionAttribute aplicado ao parâmetro não terá efeito. Ele é substituído pelo CallerMemberNameAttribute.
- CS8963: O CallerArgumentExpressionAttribute aplicado ao parâmetro não terá efeito. Ele é aplicado com um nome de parâmetro inválido.
Para corrigir esses erros, siga estas regras. Para obter mais informações, consulte atributos de informações do chamador e CallerArgumentExpressionAttribute.
- O parâmetro decorado com
CallerArgumentExpressiondeve ter tipostringou um tipo com uma conversão padrão destring, pois o atributo injeta uma representaçãostringda expressão do argumento do chamador (CS8959). Altere o tipo de parâmetro parastringou um tipo compatível. - O
CallerArgumentExpressionatributo não tem efeito sobre um parâmetro que também tem CallerLineNumberAttribute, CallerFilePathAttributeou CallerMemberNameAttribute (CS8960, CS8961, CS8962). Esses atributos de informações de chamador têm precedência, portanto, remova oCallerArgumentExpressionatributo do parâmetro. - O argumento de cadeia de caracteres passado para o
CallerArgumentExpressionconstrutor 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 terá efeito.