Compartilhar via


Resolver erros e avisos em declarações de construtor

Este artigo aborda os seguintes erros do compilador:

  • CS0132: 'construtor': um construtor estático deve ser sem parâmetros.
  • CS0514: o construtor estático não pode ter uma chamada explícita ao construtor 'this' ou 'base'.
  • CS0515: modificadores de acesso não são permitidos em construtores estáticos.
  • CS0516: o construtor "constructor" não pode chamar a si mesmo.
  • CS0517: 'class' não tem classe base e não pode chamar um construtor base.
  • CS0522: structs não podem chamar construtores de classe base.
  • CS0526: Interfaces não podem conter construtores.
  • CS0568: Structs não podem conter construtores explícitos sem parâmetros.
  • CS0573: 'declaração de campo': não é possível ter inicializadores de campo de instância em structs.
  • CS0710: classes estáticas não podem ter construtores de instância.
  • CS0768: O construtor não pode chamar a si mesmo por meio de outro construtor.
  • CS1018: Palavra-chave 'this' ou 'base' esperada.
  • CS8054: Enums não podem conter construtores explícitos sem parâmetros.
  • CS8091: não pode ser externo nem ter um inicializador de construtor.
  • CS8861: lista de argumentos inesperados.
  • CS8862: Um construtor declarado em um tipo com uma lista de parâmetros deve ter o inicializador do construtor 'this'.
  • CS8358: Não é possível usar o construtor de atributos porque ele tem parâmetros 'in'.
  • CS8867: Nenhum construtor de cópia acessível encontrado no tipo base '{0}'.
  • CS8868: Um construtor de cópia em um registro deve chamar um construtor de cópia da base ou um construtor de objeto sem parâmetros se o registro herdar do objeto.
  • CS8878: Um construtor de cópia '{0}' deve ser público ou protegido porque o registro não está lacrado.
  • CS8910: O construtor primário entra em conflito com o construtor de cópia sintetizado.
  • CS8958: O construtor de struct sem parâmetros deve ser "público".
  • CS8982: Um construtor declarado em um 'struct' com lista de parâmetros deve ter um inicializador 'this' que chame o construtor primário ou um construtor declarado explicitamente.
  • CS8983: Um 'struct' com inicializadores de campo deve incluir um construtor declarado explicitamente.
  • CS9105: Não é possível usar o parâmetro de construtor primário neste contexto.
  • CS9106: O identificador é ambíguo entre tipo e parâmetro nesse contexto.
  • CS9108: Não é possível usar um parâmetro do tipo semelhante a referência dentro de um método anônimo, expressão lambda, expressão de consulta ou função local.
  • CS9109: Não é possível usar ref, outou in parâmetro de construtor primário dentro de um membro da instância.
  • CS9110: Não é possível usar o parâmetro de construtor primário que tenha o tipo ref-like dentro de um membro de instância.
  • CS9111: métodos anônimos, expressões lambda, expressões de consulta e funções locais dentro de um membro de instância de um struct não podem acessar o parâmetro do construtor primário.
  • CS9112: métodos anônimos, expressões lambda, expressões de consulta e funções locais dentro de um struct não podem acessar o parâmetro de construtor primário também usado dentro de um membro de instância.
  • CS9114: Um parâmetro de construtor primário de um tipo somente leitura não pode receber uma atribuição (exceto no setter somente inicialização do tipo ou em um inicializador de variável).
  • CS9115: Um parâmetro de construtor primário de um tipo somente leitura não pode ser retornado por referência gravável.
  • CS9116: um parâmetro de construtor primário de um tipo somente leitura não pode ser usado como um valor de referência ou saída (exceto no setter somente inicialização do tipo ou em um inicializador de variável).
  • CS9117: Membros de um parâmetro de construtor primário de um tipo somente leitura não podem ser modificados (exceto no setter somente inicialização do tipo ou em um inicializador de variável).
  • CS9118: Membros do parâmetro de construtor primário de um tipo somente leitura não podem ser retornados por referência gravável.
  • CS9119: Membros do parâmetro de construtor primário de um tipo somente leitura não podem ser usados como valor ref ou out (exceto no setter somente inicialização do tipo ou em um inicializador de variável).
  • CS9120: Não é possível retornar o parâmetro do construtor primário por referência.
  • CS9121: O parâmetro de construtor primário de struct do tipo causa um ciclo no layout do struct.
  • CS9122: lista de parâmetros inesperados.
  • CS9136: não é possível usar o parâmetro de construtor primário do tipo dentro de um membro de instância.

Além disso, os seguintes avisos são abordados neste artigo:

  • CS0824: O construtor 'name' está marcado como externo.
  • CS9107: o parâmetro é capturado no estado do tipo delimitador e o valor dele também é transmitido para o construtor base. O valor também pode ser capturado pela classe base.
  • CS9113: o parâmetro não foi lido.
  • CS9124: Parameter é capturado no estado do tipo delimitante e seu valor também é usado para inicializar um campo, uma propriedade ou um evento.
  • CS9179: o parâmetro do construtor primário é sombreado por um membro da base
  • CS9018: A propriedade implementada automaticamente é lida antes de ser atribuída explicitamente, causando uma atribuição implícita anterior de "padrão".
  • CS9019: O campo é lido antes de ser atribuído explicitamente, causando uma atribuição implícita anterior de "padrão".
  • CS9020: O objeto 'this' é lido antes de todos os campos serem atribuídos, causando atribuições implícitas anteriores de 'padrão' a campos não atribuídos explicitamente.
  • CS9021: o controle é retornado ao chamador antes que a propriedade implementada automaticamente seja atribuída explicitamente, causando uma atribuição implícita anterior de "padrão".
  • CS9022: o controle é retornado ao chamador antes que o campo seja atribuído explicitamente, causando uma atribuição implícita anterior de "padrão".

Construtores estáticos

  • CS0132: 'construtor': um construtor estático deve ser sem parâmetros.
  • CS0514: o construtor estático não pode ter uma chamada explícita ao construtor 'this' ou 'base'.
  • CS0515: modificadores de acesso não são permitidos em construtores estáticos.

Construtores estáticos inicializam dados estáticos para um tipo. Para obter mais informações, consulte construtores estáticos.

Para corrigir esses erros, verifique se a declaração do construtor estático segue estas regras:

  • Remova todos os parâmetros da declaração de construtor estático, pois um construtor estático deve ser sem parâmetros (CS0132). Se você precisar passar valores de inicialização, considere o uso de campos estáticos ou propriedades definidas antes da execução do construtor estático.
  • Remova todos os modificadores de acesso, como public, protectedou privateinternal do construtor estático, porque o runtime controla quando o construtor estático é executado e modificadores de acesso não são significativos (CS0515).
  • Remova qualquer chamada de inicializador de : base() ou : this() construtor do construtor estático, pois construtores estáticos não podem ser encadeados a outros construtores (CS0514). O runtime invoca automaticamente o construtor estático da classe base se houver um.

Declaração do construtor

  • CS0526: Interfaces não podem conter construtores.
  • CS0710: classes estáticas não podem ter construtores de instância.
  • CS8054: Enums não podem conter construtores explícitos sem parâmetros.
  • CS8358: Não é possível usar o construtor de atributos porque ele tem parâmetros 'in'.
  • CS8091: um construtor não pode ser externo nem ter um inicializador de construtor.

Você pode declarar construtores somente dentro class e struct tipos, incluindo record class e record struct tipos. Para obter mais informações, consulte Construtores de instância.

Para corrigir esses erros, tente as seguintes sugestões:

Mova o construtor para um tipo class ou struct, porque você não pode declarar construtores nos tipos interface ou enum (CS0526, CS8054). As interfaces definem contratos, mas não fornecem lógica de inicialização e os tipos de enumeração têm seus valores definidos em tempo de compilação.

Remova construtores de instância de classes estáticas, pois as classes estáticas não podem ser instanciadas e, portanto, não podem ter construtores de instância (CS0710). Se você precisar de lógica de inicialização, use um construtor estático.

Altere in parâmetros para parâmetros pass-by-value em construtores de atributo, pois os construtores de atributo não dão suporte in a modificadores de parâmetro (CS8358). O runtime instancia atributos usando o recurso de reflexão, que não dá suporte ao modificador in.

Remova o : base() inicializador ou : this() construtor de um extern construtor, pois construtores externos não podem ser encadeados a outros construtores (CS8091). A implementação de um construtor extern é fornecida externamente, portanto, o encadeamento de construtores não é possível.

O aviso a seguir pode ser gerado para declarações de construtor:

  • CS0824: o construtor está marcado como externo.

Quando um construtor é marcado extern, o compilador não pode verificar se existe uma implementação. Para suprimir esse aviso, forneça uma implementação não extern ou verifique se a implementação externa está vinculada corretamente.

Construtores em tipos de struct

  • CS0568: Structs não podem conter construtores explícitos sem parâmetros.
  • CS0573: 'declaração de campo': não é possível ter inicializadores de campo de instância em structs.
  • CS8958: O construtor de struct sem parâmetros deve ser "público".
  • CS8982: Um construtor declarado em um 'struct' com lista de parâmetros deve ter um inicializador 'this' que chame o construtor primário ou um construtor declarado explicitamente.
  • CS8983: Um 'struct' com inicializadores de campo deve incluir um construtor declarado explicitamente.

Os tipos de struct têm regras específicas para construtores e inicialização de campos. Para obter mais informações, consulte a seção inicialização do Struct e valores padrão do artigo Tipos de estrutura .

Para corrigir esses erros, tente as seguintes sugestões:

  • Atualize para c# 10 ou posterior se você encontrar CS0568 ou CS0573, pois esses erros ocorrem apenas em versões mais antigas do C#. O C# moderno permite construtores sem parâmetros explícitos e inicializadores de campo em structs.
  • Adicione o public modificador de acesso a qualquer construtor de struct sem parâmetros, pois os construtores de struct sem parâmetro devem ser públicos para garantir que a default alocação de expressão e matriz possa inicializar corretamente as instâncias de struct (CS8958).
  • Adicione um : this(...) inicializador a construtores declarados explicitamente em uma estrutura que tenha um construtor primário, pois todos os construtores que não são sem parâmetros devem se encadear ao construtor primário ou a outro construtor explicitamente declarado para garantir a inicialização consistente (CS8982).
  • Declare um construtor explícito quando o struct usa inicializadores de campo, pois o compilador requer um construtor explícito para garantir que os inicializadores de campo sejam invocados (CS8983). Esse construtor pode ser um construtor sem parâmetros com um corpo vazio.

Os avisos a seguir indicam que um campo ou propriedade não é atribuído explicitamente antes de ser lido ou antes de o controle retornar ao chamador:

  • CS9018: A propriedade implementada automaticamente é lida antes de ser atribuída explicitamente, causando uma atribuição implícita anterior de "padrão".
  • CS9019: O campo é lido antes de ser atribuído explicitamente, causando uma atribuição implícita anterior de "padrão".
  • CS9020: o objeto 'this' é lido antes de todos os campos serem atribuídos, causando atribuições implícitas anteriores de 'padrão' a campos não atribuídos explicitamente.
  • CS9021: o controle é retornado ao chamador antes que a propriedade implementada automaticamente seja atribuída explicitamente, causando uma atribuição implícita anterior de "padrão".
  • CS9022: o controle é retornado ao chamador antes que o campo seja atribuído explicitamente, causando uma atribuição implícita anterior de "padrão".

Para silenciar esses avisos, atribua explicitamente todos os campos e propriedades implementadas automaticamente antes de lê-los ou antes que o controle retorne do construtor (CS9018, CS9019, CS9020, CS9021, CS9022). Quando membros não atribuídos são lidos, o compilador atribui default implicitamente a eles, o que pode não ser o comportamento pretendido.

Chamadas de construtor com base e this

  • CS0516: o construtor não pode chamar a si mesmo.
  • CS0517: 'class' não tem classe base e não pode chamar um construtor base.
  • CS0522: structs não podem chamar construtores de classe base.
  • CS0768: O construtor não pode chamar a si mesmo por meio de outro construtor.
  • CS1018: Palavra-chave 'this' ou 'base' esperada.

Usando inicializadores de construtor, um construtor pode chamar outro construtor usando : this() ou : base(). Para obter mais informações, consulte Como usar construtores.

Para corrigir esses erros, tente as seguintes sugestões:

  • Quebre qualquer cadeia de chamadas de construtores circulares, visto que um construtor não pode se chamar direta ou indiretamente por meio de outro construtor (CS0516, CS0768). Certifique-se de que o encadeamento de construtores eventualmente termine em um construtor que não chame outro construtor do mesmo tipo.
  • Remova o : base() inicializador de construtores em tipos de struct ou de System.Object, pois esses tipos não têm um construtor de classe base para chamar (CS0517, CS0522). Tipos de struct herdam implicitamente, System.ValueTypemas você não pode chamar explicitamente seu construtor.
  • Conclua o inicializador do construtor ou remova o dois-pontos (:) da declaração do construtor, pois quando um dois-pontos segue uma assinatura de construtor, o compilador espera this() ou base() (CS1018). Adicione a chamada de construtor apropriada ou remova totalmente os dois-pontos se nenhum encadeamento for pretendido.

Registros e construtores de cópia

  • CS8867: Nenhum construtor de cópia acessível foi encontrado no tipo base.
  • CS8868: Um construtor de cópia em um registro precisa chamar um construtor de cópia da base, ou um construtor de objeto sem parâmetros se o registro herdar do objeto.
  • CS8878: Um construtor de cópia precisa ser público ou protegido porque o registro não está selado.
  • CS8910: O construtor primário entra em conflito com o construtor de cópia sintetizado.

Em um tipo de registro derivado, o seu construtor de cópia explícito deve chamar o construtor de cópia do tipo base usando o inicializador : this(). Se o registro herda diretamente de System.Object, ele pode chamar o construtor de objeto sem parâmetros (CS8868).

Os registros incluem um construtor de cópia sintetizado pelo compilador. Você pode escrever um construtor de cópia explícito, mas ele deve atender a requisitos específicos. O compilador gera erros quando construtores de cópia de registro violam estes requisitos:

  • O tipo base deve ter um construtor de cópia acessível. Todos os record tipos têm um construtor de cópia. Verifique se o tipo base é um record ou adicione um construtor de cópia acessível a ele (CS8867).
  • Em um tipo de registro derivado, o seu construtor de cópia explícito deve chamar o construtor de cópia do tipo base usando o inicializador : base(). Se o registro herdar diretamente de System.Object, em vez disso, poderá chamar o construtor de objeto sem parâmetros (CS8868).
  • Construtores de cópia devem ser public ou protected a menos que o tipo de registro seja sealed. Adicione o modificador de acesso apropriado ao construtor de cópia (CS8878).
  • Se o construtor de cópia explícita tiver a mesma assinatura que o construtor de cópia sintetizado, as definições entrarão em conflito. Remova o construtor de cópia explícito ou modifique sua assinatura (CS8910).

Declaração de construtor primário

Construtores primários declaram parâmetros diretamente na declaração de tipo. O compilador sintetiza um campo para armazenar um parâmetro de construtor primário quando você o usa em membros ou inicializadores de campo.

Encadeamento do construtor

  • CS8861: Lista de argumentos inesperados.
  • CS8862: Um construtor declarado em um tipo com lista de parâmetros precisa ter o inicializador de construtor 'this'.
  • CS9122: Lista de parâmetros inesperada.

Quando um tipo tem um construtor primário, todos os outros construtores declarados explicitamente devem encadeá-lo usando : this(...). Adicione um : this(...) inicializador que passa os argumentos apropriados para o construtor primário (CS8862).

Remova uma lista de parâmetros da referência de tipo base quando o tipo base não tiver um construtor primário. A sintaxe class Derived : Base(args) só é válida quando Base tem um construtor primário (CS8861). Da mesma forma, remova uma lista de parâmetros do construtor primário de uma declaração interface , pois as interfaces não podem ter construtores primários (CS9122).

Uso de parâmetro em chamadas de construtor base

  • CS9105: Não é possível usar o parâmetro de construtor primário neste contexto.
  • CS9106: O identificador é ambíguo entre tipo e parâmetro nesse contexto.

Você só poderá usar parâmetros de construtor primário na chamada do construtor base se passá-los como parte da declaração do construtor primário. Para corrigir o CS9105, mova o uso do parâmetro para a cláusula base da declaração do tipo, em vez de usá-lo em uma chamada de construtor explicitamente declarada : base().

Se um tipo e um parâmetro de construtor primário compartilharem o mesmo nome, a referência se tornará ambígua. Para corrigir o CS9106, renomeie o tipo ou o parâmetro.

Parâmetros de tipo ref-like

  • CS9108: Não é possível usar parâmetro que tenha tipo ref dentro de um método anônimo, expressão lambda, expressão de consulta ou função local.
  • CS9109: Não é possível usar ref, outou in parâmetro de construtor primário dentro de um membro da instância.
  • CS9110: Não é possível usar o parâmetro de construtor primário que tem um tipo semelhante a ref dentro de um membro de instância.
  • CS9136: não é possível usar o parâmetro de construtor primário do tipo dentro de um membro de instância.

Para resolver estes erros:

  • Os parâmetros de construtor primário do ref struct tipo têm restrições sobre onde você pode usá-los. Mova o acesso de parâmetro para fora de expressões lambda, expressões de consulta ou funções locais (CS9108). Em tipos que não contêm ref struct, acesse ref struct parâmetros apenas em inicializadores de campos ou no corpo do construtor, não em membros de instância (CS9110, CS9136).
  • Para ref struct classes, você não pode usar parâmetros do construtor principal com os modificadores in, ref ou out em métodos de instância ou acessadores de propriedade. Copie o valor do parâmetro para um campo no construtor e use esse campo em membros de instância (CS9109).

Restrições de tipo de struct

  • CS9111: métodos anônimos, expressões lambda, expressões de consulta e funções locais dentro de um membro de instância de um struct não podem acessar o parâmetro do construtor primário.
  • CS9112: Métodos anônimos, expressões lambda, expressões de consulta e funções locais dentro de um struct não podem acessar o parâmetro de construtor primário, também usado dentro de um membro de instância.
  • CS9120: Não é possível retornar o parâmetro de construtor primário por referência.
  • CS9121: O parâmetro de construtor primário de struct do tipo causa um ciclo no layout do struct.

Para resolver estes erros:

  • Em tipos struct, você não pode capturar parâmetros de construtor primário em expressões lambda, expressões de consulta ou funções locais dentro de membros de instância. Copie o parâmetro para uma variável ou campo local antes de usá-lo nesses contextos (CS9111, CS9112).
  • Você não pode retornar parâmetros de construtor primários por referência em tipos de estrutura. Armazene o valor em um campo e retorne esse campo por referência, se necessário (CS9120).
  • Verifique se o tipo de parâmetro de construtor primário não cria um ciclo no layout do struct. Um struct não pode conter um campo de seu próprio tipo direta ou indiretamente (CS9121).

Restrições de estruturas de somente leitura

  • CS9114: Um parâmetro de construtor primário de um tipo somente leitura não pode receber uma atribuição (exceto no setter somente inicialização do tipo ou em um inicializador de variável).
  • CS9115: Um parâmetro de construtor primário de um tipo somente leitura não pode ser retornado por referência gravável.
  • CS9116: um parâmetro de construtor primário de um tipo somente leitura não pode ser usado como um valor ref ou out (exceto no setter somente inicialização do tipo ou em um inicializador de variável).
  • CS9117: Membros de um parâmetro de construtor primário de um tipo somente leitura não podem ser modificados (exceto no setter somente inicialização do tipo ou em um inicializador de variável).
  • CS9118: Membros do parâmetro de construtor primário de um tipo somente leitura não podem ser retornados por referência gravável.
  • CS9119: Membros do parâmetro de construtor primário de um tipo somente leitura não podem ser usados como valor ref ou out (exceto no setter somente inicialização do tipo ou em um inicializador de variável).

Para resolver estes erros:

  • Em readonly struct tipos, você não pode modificar os parâmetros do construtor primário e seus membros fora de setters exclusivos para inicialização ou de inicializadores de variáveis. Mover atribuições para inicializadores de campo ou definidores de propriedade somente para inicialização (CS9114, CS9117).
  • Você não pode retornar parâmetros do construtor primário e seus membros por referência modificável em tipos readonly struct. Retornar por readonly ref ou por valor em vez disso (CS9115, CS9118).
  • Você não pode passar parâmetros de construtor primário e seus membros como argumentos ref ou out para tipos readonly struct. Passe-os por valor ou como in argumentos em vez disso (CS9116, CS9119).

Avisos para parâmetros capturados e ocultados

  • CS9107: o parâmetro é capturado no estado do tipo delimitador e seu valor também é passado para o construtor base. O valor também pode ser capturado pela classe base.
  • CS9113: o parâmetro não é lido.
  • CS9124: O parâmetro é capturado no estado do tipo envolvente e seu valor também é usado para inicializar um campo, uma propriedade ou um evento.
  • CS9179: O parâmetro do construtor primário é sombreado por um membro da base.

Os avisos a seguir indicam possíveis problemas com a forma como você armazena ou acessa parâmetros de construtor primário:

  • Você pode armazenar um parâmetro duas vezes se você tanto passar para o construtor base quanto acessar no tipo derivado. Você pode ter uma cópia na classe base e outra na classe derivada. Considere se você precisa de ambas as cópias ou reestruturar seu código para evitar a duplicação (CS9107).
  • Você não precisará de um parâmetro de construtor primário se nunca o ler. Remova parâmetros não utilizados da declaração do construtor primário (CS9113).
  • Você poderá armazenar um parâmetro duas vezes se capturá-lo no tipo envolvente e usá-lo para inicializar um campo, uma propriedade ou um evento. Considere usar o parâmetro capturado diretamente em vez de inicializar um membro separado (CS9124).
  • Um membro do tipo base sombreia um parâmetro de construtor primário quando ambos têm o mesmo nome. Renomeie o parâmetro para evitar confusão (CS9179).