Resolver erros e avisos para declarações de construtores e inicializadores de módulos

Este artigo aborda os seguintes erros do compilador:

  • CS0132: 'constructor': um construtor estático deve ser sem parâmetros.
  • CS0514: construtor estático não pode ter uma chamada explícita de construtor 'this' ou 'base'.
  • CS0515: modificadores de acesso não são permitidos em construtores estáticos.
  • CS0516: O construtor 'construtor' não pode chamar a si mesmo.
  • CS0517: 'class' não tem classe base e não pode chamar um construtor base.
  • CS0522: estruturas não podem chamar construtores de classe base.
  • CS0526: As interfaces não podem conter construtores de instância.
  • CS0568: Structs não pode conter construtores sem parâmetros explícitos.
  • CS0573: 'declaração de campo': não é possível ter inicializadores de campos de instância em structs.
  • CS0710: Classes estáticas não podem ter construtores de instância.
  • CS0768: Construtor não pode chamar a si mesmo através de outro construtor.
  • CS1018: Palavra-chave 'this' ou 'base' esperada.
  • CS8054: Enums não pode conter construtores sem parâmetros explícitos.
  • CS8091: não pode ser extern e ter um inicializador de construtor.
  • CS8760: 'evento': o evento externo não pode ter inicializador.
  • CS8358: Não pode usar o construtor de atributos porque tem parâmetros 'in' ou 'ref readonly'.
  • CS8813: Um inicializador de módulo deve ser um método membro comum
  • CS8814: O método inicializador de módulo 'método' deve ser acessível ao nível do módulo
  • CS8815: O método inicializador de módulo 'método' deve ser estático, não virtual, não deve ter parâmetros e deve devolver 'void'
  • CS8816: O método inicializador de módulo 'método' não pode ser genérico nem pode estar contido num tipo genérico
  • CS8861: Lista de argumentos inesperados.
  • CS8862: Um construtor declarado num tipo com lista de parâmetros deve ter um inicializador de construtor 'this'.
  • 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.
  • CS8900: O inicializador de módulo não pode ser atribuído a 'UnmanagedCallersOnly'.
  • CS8901: 'method' é marcado com 'UnmanagedCallersOnly' e não é possível chamá-lo diretamente. É necessário obter um ponteiro de função para este método.
  • CS8902: 'método' está marcado com 'UnmanagedCallersOnly' e não pode ser convertido para um tipo de delegado. Obtenha um ponteiro de função para este método.
  • CS8910: O construtor primário entra em conflito com o construtor de cópia sintetizada.
  • CS8958: O construtor 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 chama o construtor primário ou um construtor explicitamente declarado.
  • CS8983: Um 'struct' com inicializadores de campo deve incluir um construtor explicitamente declarado.
  • CS9105: Não é possível usar o parâmetro do construtor primário neste contexto.
  • CS9106: O identificador é ambíguo entre tipo e parâmetro neste contexto.
  • CS9108: Não é possível usar o parâmetro que tem tipo ref-like 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, out, ou in parâmetro do construtor primário dentro de um membro da instância.
  • CS9110: Não é possível usar o parâmetro do construtor primário que tenha o tipo ref-like dentro de um membro da 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 primário do construtor.
  • 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 do construtor primário também usado dentro de um membro da instância.
  • CS9114: Um parâmetro primário de um tipo somente leitura no construtor não pode ser atribuído (exceto no setter apenas de 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 de leitura não pode ser usado como um valor ref ou out (exceto no setter de inicialização do tipo ou em um inicializador de variável).
  • CS9117: Os membros dos parâmetros do construtor primário de um tipo somente leitura não podem ser modificados (exceto no setter apenas de inicialização do tipo ou num inicializador de variável).
  • CS9118: Membros do parâmetro de um construtor primário de um tipo de leitura exclusivamente não podem ser retornados por referência que permita escrita.
  • CS9119: Os membros do parâmetro do construtor primário de um tipo somente leitura não podem ser usados como um valor ref ou out (exceto no setter de apenas inicialização do tipo ou em um inicializador de variável).
  • CS9120: Não é possível retornar o parâmetro primário do construtor por referência.
  • CS9121: O parâmetro de um tipo no construtor primário de struct causa um ciclo na disposição da struct.
  • CS9122: Lista de parâmetros inesperada.
  • CS9136: Não é possível usar o parâmetro primário do construtor do tipo dentro de um membro da 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 de inclusão 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 foi lido.
  • CS9124: O parâmetro é capturado no estado do tipo de inclusão e seu valor também é usado para inicializar um campo, propriedade ou evento.
  • CS9179: O parâmetro do construtor primário é sombreado por um membro da base
  • CS9018: A propriedade auto-implementada é lida antes de ser explicitamente atribuída, causando uma atribuição implícita anterior de 'default'.
  • CS9019: O campo é lido antes de ser explicitamente atribuído, causando uma atribuição implícita anterior de 'default'.
  • CS9020: O objeto 'this' é lido antes de todos os seus campos serem atribuídos, causando atribuições implícitas anteriores de 'default' a campos atribuídos não explicitamente.
  • CS9021: O controlo é devolvido ao chamador antes de a propriedade auto-implementada ser explicitamente atribuída, causando uma atribuição implícita anterior de 'default'.
  • CS9022:O controlo é devolvido ao chamador antes de o campo ser explicitamente atribuído, causando uma atribuição implícita anterior de 'default'.

Construtores estáticos

  • CS0132: 'constructor': 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 estes erros, certifique-se de que a declaração do seu construtor estático segue estas regras:

  • Remover quaisquer parâmetros da declaração do construtor estático, porque um construtor estático deve ser sem parâmetros (CS0132). Se precisares de passar valores de inicialização, considera usar campos estáticos ou propriedades que defines antes de o construtor estático executar.
  • Remova quaisquer modificadores de acesso como public, protected, private, ou internal do construtor estático, porque o runtime controla quando o construtor estático é executado e os modificadores de acesso não são significativos (CS0515).
  • Remova quaisquer chamadas de inicializador de construtores : base() ou : this() do construtor estático, porque construtores estáticos não podem ser encadeados a outros construtores (CS0514). O runtime invoca automaticamente o construtor estático da classe base, se existir um.

Declaração do construtor

  • CS0526: As interfaces não podem conter construtores de instância.
  • CS0710: Classes estáticas não podem ter construtores de instância.
  • CS8054: Enums não pode conter construtores sem parâmetros explícitos.
  • CS8358: Não pode usar o construtor de atributos porque tem parâmetros 'in' ou 'ref readonly'.
  • CS8091: Um construtor não pode ser externo e ter um inicializador de construtor.
  • CS8760: 'evento': o evento externo não pode ter inicializador.

Podes declarar construtores apenas em class e struct tipos, incluindo record class e record struct tipos. Para mais informações, veja Construtores de Instância.

Para corrigir estes erros, experimente as seguintes sugestões:

  • Mude o construtor para um tipo class ou struct, porque não pode declarar construtores em tipos interface ou enum (CS0526, CS8054). As interfaces definem contratos mas não fornecem lógica de inicialização, e os tipos enum têm os seus valores definidos em tempo de compilação.
  • Remover construtores de instância das classes estáticas, porque as classes estáticas não podem ser instanciadas e, portanto, não podem ter construtores de instância (CS0710). Se precisares de lógica de inicialização, usa um construtor estático em vez disso.
  • Alterem os parâmetros in ou ref readonly para parâmetros pass-by-value em construtores de atributos, porque os construtores de atributos não suportam modificadores de parâmetros in ou ref readonly (CS8358). O runtime instancia atributos usando reflexão, que não suporta os modificadores in ou ref readonly.
  • Remova o : base() inicializador de construtor ou : this() de um extern construtor, porque construtores externos não podem encadear para outros construtores (CS8091). A implementação de um construtor externo é feita fora do código, pelo que a encadeamento de construtores não é possível.
  • Remover o inicializador de uma extern declaração de evento (CS8760). Os eventos externos têm os acessores add e remove fornecidos por código externo, pelo que um inicializador de campo no código-fonte não tem efeito e não é permitido pelo compilador.

O seguinte aviso pode ser gerado para declarações de construtores:

  • CS0824: O construtor está marcado como externo.

Quando um construtor é marcado extern, o compilador não pode verificar que existe uma implementação. Para suprimir este aviso, deve fornecer uma implementação não externa ou garantir que a implementação externa está corretamente ligada.

Construtores em tipos struct

  • CS0568: Structs não pode conter construtores sem parâmetros explícitos.
  • CS0573: 'declaração de campo': não pode haver inicializações de campos de instância em estruturas.
  • CS8958: O construtor 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 chama o construtor primário ou um construtor explicitamente declarado.
  • CS8983: Um 'struct' com inicializadores de campo deve incluir um construtor explicitamente declarado.

Os tipos struct têm regras específicas para construtores e inicialização de campos. Para mais informações, consulte a secção Inicialização de Estruturas e Valores Predefinidos do artigo Tipos de Estrutura.

Para corrigir estes erros, experimente as seguintes sugestões:

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

Os seguintes avisos indicam que um campo ou propriedade não é explicitamente atribuído antes de ser lido ou antes de o controlo regressar ao chamador:

  • CS9018: A propriedade auto-implementada é lida antes de ser explicitamente atribuída, causando uma atribuição implícita anterior de 'default'.
  • CS9019: O campo é lido antes de ser explicitamente atribuído, causando uma atribuição implícita anterior de 'default'.
  • CS9020: O objeto 'this' é lido antes de todos os seus campos serem atribuídos, causando atribuições implícitas anteriores de 'default' a campos atribuídos não explicitamente.
  • CS9021: O controlo é devolvido ao chamador antes de a propriedade auto-implementada ser explicitamente atribuída, causando uma atribuição implícita anterior de 'default'.
  • CS9022:O controlo é devolvido ao chamador antes de o campo ser explicitamente atribuído, causando uma atribuição implícita anterior de 'default'.

Para silenciar estes avisos, atribui explicitamente todos os campos e propriedades auto-implementadas antes de os ler ou antes de retornos de controlo do construtor (CS9018, CS9019, CS9020, CS9021, CS9022). Quando membros não atribuídos são lidos, o compilador atribui-lhes default implicitamente, o que pode não ser o comportamento pretendido.

Chamadas do construtor com base e this

  • CS0516: O construtor não pode chamar-se a si mesmo.
  • CS0517: 'class' não tem classe base e não pode chamar um construtor base.
  • CS0522: Structs não pode chamar construtores de classe base.
  • CS0768: O construtor não pode invocar-se a si próprio através de outro construtor.
  • CS1018: É esperada a palavra-chave 'this' ou 'base'.

Ao usar inicializadores de construtor, um construtor pode chamar outro construtor usando : this() ou : base(). Para mais informações, consulte Utilização de construtores.

Para corrigir estes erros, experimente as seguintes sugestões:

  • Interrompa qualquer cadeia circular de chamadas de construtor, porque um construtor não pode chamar-se a si próprio, seja de forma direta ou indireta, através de outro construtor (CS0516, CS0768). Certifique-se de que a cadeia de construtores termine num construtor que não chame outro construtor do mesmo tipo.
  • Remova o : base() inicializador dos construtores de tipos de struct ou de System.Object, porque estes tipos não têm um construtor de classe base para chamar (CS0517, CS0522). Os tipos de struct herdam implicitamente de System.ValueType, mas não é possível chamar explicitamente o seu construtor.
  • Completa a inicialização do construtor ou remove os dois-pontos (:) da declaração do construtor, porque quando um dois-pontos segue uma assinatura de construtor, o compilador espera ou this()base() (CS1018). Ou adiciona a chamada ao construtor apropriada ou remove completamente os dois-pontos se não houver intenção de encadeamento.

Construtores de registros e cópias

  • CS8867: Nenhum construtor de cópia acessível encontrado no tipo base.
  • 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 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 sintetizada.

Num tipo de registo derivado, o seu construtor explícito de cópias deve chamar o construtor de cópia do tipo base utilizando o inicializador : this(). Se o registro herdar diretamente de System.Object, pode chamar o construtor do objeto sem parâmetros (CS8868).

Os registos incluem um construtor de cópias sintetizado pelo compilador. Podes escrever um construtor de cópias explícito, mas tem de cumprir requisitos específicos. O compilador gera erros quando os construtores de cópias de registos violam estes requisitos:

  • O tipo base deve ter um construtor de cópias acessível. Todos os record tipos têm um construtor de cópia. Certifique-se de que o tipo base é um record, ou adicione-lhe um construtor de cópias acessível (CS8867).
  • Num tipo de registo derivado, o seu construtor explícito de cópias deve chamar o construtor de cópia do tipo base utilizando o inicializador : base(). Se o registro herdar diretamente de System.Object, pode chamar o construtor do objeto sem parâmetros (CS8868).
  • Os construtores de cópias devem ser public ou protected a menos que o tipo de registo seja sealed. Adicione o modificador de acesso apropriado ao construtor de cópias (CS8878).
  • Se o seu construtor de cópias explícitas tiver a mesma assinatura que o construtor de cópias sintetizadas, as definições entram em conflito. Remova o seu construtor de cópias explícitas ou modifique a sua assinatura (CS8910).

Declarações de inicializadores de módulo

  • CS8813: Um inicializador de módulo deve ser um método membro comum.
  • CS8814: O método inicializador de módulo 'método' deve ser acessível ao nível do módulo.
  • CS8815: O método inicializador de módulo 'método' deve ser estático, não virtual, não deve ter parâmetros e deve devolver 'void'.
  • CS8816: Método inicializador de módulo 'método' não pode ser genérico nem pode estar contido num tipo genérico.
  • CS8900: O inicializador de módulo não pode ser atribuído a 'UnmanagedCallersOnly'.
  • CS8901: 'método' é atribuído com 'UnmanagedCallersOnly' e não pode ser chamado diretamente. Obtenha um ponteiro de função para este método.
  • CS8902: 'método' tem o atributo 'UnmanagedCallersOnly' e não pode ser convertido para um tipo de delegado. Obtenha um ponteiro de função para este método.

Estes erros impõem os requisitos para métodos marcados com ModuleInitializerAttribute. Os inicializadores de módulo executam-se automaticamente quando um assembly é carregado pela primeira vez, antes de qualquer outro código do módulo ser executado. Para as regras completas, veja inicializadores de módulos.

Para corrigir estes erros, aplique uma das seguintes alterações com base no diagnóstico específico:

  • Certifique-se de que o método marcado com [ModuleInitializer] é um método comum, e não um acessório de propriedades, acessório de eventos, função local, lambda, construtor, destruidor ou operador (CS8813). O compilador só pode tratar uma declaração de método comum como um destino válido para a infraestrutura do inicializador de módulos.
  • Torne o método inicializador de módulo e todos os tipos que o contêm internal ou public para que o método seja acessível fora do tipo de nível superior (CS8814). O runtime precisa de chamar o método a partir de código gerado ao nível do módulo, o que requer acessibilidade ao nível do módulo.
  • Declare o método do inicializador de módulo como static, não virtual, sem parâmetros, e com um void tipo de retorno (CS8815). O runtime chama inicializadores de módulo sem quaisquer argumentos e descarta o resultado, pelo que a assinatura do método deve corresponder exatamente a estas restrições.
  • Remover parâmetros genéricos de tipo do método inicializador de módulo e mover o método para fora de qualquer tipo genérico que contenha (CS8816). O runtime não consegue determinar que tipos de argumentos fornecer ao invocar o inicializador, por isso métodos genéricos e métodos em tipos genéricos não são permitidos.
  • Remover o UnmanagedCallersOnlyAttribute do método inicializador de módulo (CS8900). Os inicializadores de módulo são chamados pela infraestrutura de execução gerida, pelo que não podem ser restritos apenas a chamadores não geridos.
  • Obtenha um ponteiro de função, em vez de chamar diretamente um método marcado com [UnmanagedCallersOnly] (CS8901). Métodos atribuídos a UnmanagedCallersOnlyAttribute não podem ser chamados a partir de código gerido. Use o & operador para obter um ponteiro de função (delegate* unmanaged<...>) num unsafe contexto e passe o ponteiro para código não gerido. Caso o seu projeto ainda não permita código inseguro, ative AllowUnsafeBlocks.
  • Obtenha um ponteiro de função em vez de transformar um método marcado com [UnmanagedCallersOnly] num tipo delegate (CS8902). Os métodos atribuídos a UnmanagedCallersOnlyAttribute não podem ser representados como delegados geridos porque a convenção de chamada é incompatível. Use ponteiros de função (delegate* unmanaged<...>) num unsafe contexto em vez disso. Caso o seu projeto ainda não permita código inseguro, ative AllowUnsafeBlocks.

Para obter mais informações, consulte ModuleInitializerAttribute e UnmanagedCallersOnlyAttribute.

Declaração do construtor primário

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

Encadeamento de construtores

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

Quando um tipo tem um construtor primário, todos os outros construtores explicitamente declarados devem encadeá-lo usando : this(...).

Para corrigir estes erros, experimente as seguintes sugestões:

  • Adicione um : this(...) inicializador que passe os argumentos apropriados ao construtor primário, porque todos os construtores explicitamente declarados têm de se encadear ao construtor primário (CS8862).
  • Remova uma lista de parâmetros da referência do tipo base quando o tipo base não tem um construtor primário, porque a sintaxe class Derived : Base(args) só é válida quando Base tem um construtor primário (CS8861).
  • Remover uma lista de parâmetros de construtores primários de uma interface declaração, porque interfaces não podem ter construtores primários (CS9122).

Utilização de parâmetros em chamadas de construtores base

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

Só podes usar parâmetros do construtor primário na chamada ao construtor base se os passares como parte da declaração do construtor primário.

Para corrigir estes erros, experimente as seguintes sugestões:

  • Mover a utilização do parâmetro para a cláusula base da declaração de tipo em vez de a usar numa chamada de construtor explicitamente declarada : base() , porque os parâmetros primários do construtor só podem aparecer na cláusula base da declaração de tipo (CS9105).
  • Renomeie o tipo ou o parâmetro quando um tipo e um parâmetro construtor primário partilham o mesmo nome, porque a referência torna-se ambígua (CS9106).

Parâmetros de tipo semelhantes a ref

  • CS9108: Não é possível usar o parâmetro que tem tipo ref-like 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, out, ou in parâmetro do construtor primário dentro de um membro da instância.
  • CS9110: Não é possível usar o parâmetro do construtor primário que tenha o tipo ref-like dentro de um membro da instância.
  • CS9136: Não é possível usar o parâmetro de construtor primário de tipo dentro de um membro de instância.

Para corrigir estes erros:

  • Os parâmetros primários do construtor do ref struct tipo têm restrições sobre onde se podem usar. Mova o acesso ao parâmetro para fora de expressões lambda, expressões de consulta ou funções locais (CS9108). Nos tipos que não são ref struct, aceda a parâmetros ref struct apenas nos inicializadores de campos ou no corpo do construtor, não nos membros da instância (CS9110, CS9136).
  • Para tipos ref struct, não pode usar parâmetros de construtores primários com modificadores in, ref ou out em métodos de instância ou acessores de propriedades. Copie o valor do parâmetro para um campo no construtor e use esse campo nos membros da instância em vez disso (CS9109).

Restrições do 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 primário do construtor.
  • 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 do construtor primário também usado dentro de um membro da instância.
  • CS9120: Não é possível retornar o parâmetro primário do construtor por referência.
  • CS9121: O parâmetro de tipo do construtor primário da struct causa um ciclo no layout da struct.

Para corrigir estes erros:

  • Nos tipos struct, não se podem capturar parâmetros primários do construtor em expressões lambda, expressões de consulta ou funções locais dentro dos membros da instância. Copie o parâmetro para uma variável ou campo local antes de o usar nestes contextos (CS9111,CS9112).
  • Não podes devolver parâmetros primários do construtor por referência nos tipos de struct. Armazene o valor num campo e devolve esse campo por referência, se necessário (CS9120).
  • Certifique-se de que o tipo de um parâmetro construtor primário não cria um ciclo no layout da estrutura. Uma struct não pode conter um campo do seu próprio tipo, direta ou indiretamente (CS9121).

Restrições de struct somente de leitura

  • CS9114: Um parâmetro primário do construtor de um tipo de leitura única não pode ser atribuído (exceto no setter de 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 de somente leitura não pode ser usado como valor de ref ou out (exceto no definidor de inicialização apenas do tipo ou num inicializador de variável).
  • CS9117: Os membros do parâmetro de construtor primário de um tipo de apenas leitura não podem ser modificados (exceto no definidor apenas de inicialização do tipo ou em um inicializador de variável).
  • CS9118: Membros de um parâmetro de construtor principal de um tipo somente leitura não podem ser retornados por uma referência gravável.
  • CS9119: Os membros do parâmetro de construtor principal de um tipo somente leitura não podem ser usados como valor ref ou out (exceto no assentador apenas para inicialização do tipo ou em um inicializador de variável).

Para corrigir estes erros:

  • Nos readonly struct types, não podes modificar parâmetros primários do construtor e os seus membros fora dos setters init-only ou inicializadores de variáveis. Mover as atribuições para inicializadores de campo ou para definidores de propriedades somente de inicialização (CS9114, CS9117).
  • Não podes devolver por referência gravável os parâmetros primários do construtor e os seus membros em tipos readonly struct. Devolve por readonly ref ou por valor em vez disso (CS9115, CS9118).
  • Não se podem passar os parâmetros do construtor primário e os seus membros como ref ou out argumentos nos tipos readonly struct. Transmita-os por valor ou como in argumentos em vez disso (CS9116, CS9119).

Avisos sobre parâmetros capturados e ocultos

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

Os seguintes avisos indicam potenciais problemas na forma como armazena ou acede aos parâmetros do construtor primário:

  • Podes armazenar um parâmetro duas vezes se o passares para o construtor base e o acederes no tipo derivado. Podes ter uma cópia na classe base e outra na classe derivada. Considere se precisa de ambas as cópias, ou se reestruturar o seu código para evitar a duplicação (CS9107).
  • Não precisas de um parâmetro de construtor primário se nunca o utilizares. Remover parâmetros não utilizados da declaração do construtor primário (CS9113).
  • Pode armazenar um parâmetro duas vezes se o capturarem no tipo de anexo e o usarem para inicializar um campo, propriedade ou 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 construtor primário quando ambos têm o mesmo nome. Renomeie o parâmetro para evitar confusão (CS9179).