Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O compilador C# gera erros quando se utilizam indevidamente tipos de união ou hierarquias de tipos fechados. Um tipo de união representa um valor que pode ser um de vários tipos de casos, com conversões implícitas e correspondência exaustiva de padrões. Hierarquias fechadas restringem quais tipos podem derivar de um tipo base. Estes diagnósticos ajudam-no a seguir as regras para declarar e usar tipos de união e hierarquias fechadas.
- CS9370: Uma declaração sindical deve especificar pelo menos um tipo de caso.
- CS9371: Não é possível converter o tipo 'tipo' em 'objeto' através de uma referência implícita ou conversão boxing.
- CS9373: Campos de instância, propriedades automáticas ou eventos do tipo campo não são permitidos numa declaração 'union'.
- CS9374: Construtores públicos explicitamente declarados com um único parâmetro não são permitidos numa declaração de 'união'.
- CS9375: Um construtor declarado numa declaração de 'união' deve ter um inicializador 'this' que chame um construtor sintetizado ou um construtor explicitamente declarado.
- CS9380: Tipos e pseudónimos não podem ser nomeados 'fechados'.
- CS9381: 'tipo': um tipo fechado não pode ser selado nem estático
- CS9382: 'tipo': não pode usar um tipo fechado 'tipo' de outro conjunto como tipo base.
- CS9383: 'type': O parâmetro de tipo 'parameter' deve ser referenciado no tipo base 'type' porque o tipo base está fechado.
- CS9384: 'tipo': um tipo fechado não pode ser marcado como abstrato porque é sempre implicitamente abstrato.
- CS9385: Um tipo de união deve ter pelo menos um membro de criação da união.
- CS9386: Um tipo de fornecedor de membro de união deve ter uma propriedade de instância 'Value' do tipo 'object?' ou 'object'. A propriedade deve ter um acessor get público.
- CS9387: Uma declaração de 'sindicato' não pode usar uma interface de fornecedor membro do sindicato.
Requisitos de declaração sindical
- CS9370: Uma declaração sindical deve especificar pelo menos um tipo de caso.
- CS9371: Não é possível converter o tipo 'tipo' para 'objeto' por meio de uma conversão de referência implícita ou de empacotamento.
Uma declaração sindical especifica um nome e uma lista de tipos de casos. Estes erros asseguram os requisitos estruturais de uma declaração de união válida. Para as regras completas, consulte a especificação de características de tipos de união.
Para corrigir estes erros, aplique as seguintes alterações à sua declaração sindical:
- Adicione pelo menos um tipo de caso à lista de tipos do sindicato (CS9370). Um sindicato deve ter um ou mais tipos de casos porque o propósito do sindicato é representar um conjunto fechado de alternativas. Uma declaração como
union Empty(), sem tipos de casos, não tem significado. - Altere ou remova tipos de casos que não se convertem para
objectatravés de uma referência implícita ou conversão de boxing (CS9371). Os tipos Union armazenam o seu conteúdo como uma únicaobject?referência, pelo que cada tipo de caso deve ser convertível paraobject. Tipos como apontadores ou tiposref structnão satisfazem este requisito. Substitua-os por um tipo de embalagem que possa ser embalado ou guardado como referência.
Restrições aos membros do sindicato
- CS9373: Campos de instância, propriedades automáticas ou eventos do tipo campo não são permitidos numa declaração de 'união'.
- CS9374: Construtores públicos explicitamente declarados com um único parâmetro não são permitidos numa declaração de 'união'.
- CS9375: Um construtor declarado numa declaração de 'união' deve ter um inicializador 'this' que chame um construtor sintetizado ou um construtor explicitamente declarado.
Uma declaração sindical pode incluir um órgão com membros adicionais, mas o compilador restringe o que pode declarar. Estas restrições garantem que os construtores de conversão gerados pelo compilador e o mecanismo de armazenamento funcionam corretamente. Para as regras completas, consulte a especificação de características de tipos de união.
Para corrigir estes erros, aplique as seguintes alterações aos membros do seu sindicato:
- Remover campos de instância, propriedades auto-implementadas e eventos semelhantes a campos do organismo sindical (CS9373). Uma união não define novos membros de dados. Compõe tipos existentes num conjunto fechado de alternativas. Declare qualquer estado adicional nas próprias categorias de caso ou use membros estáticos na união.
- Remover ou alterar a acessibilidade de qualquer construtor público explicitamente declarado que aceite um único parâmetro (CS9374). O compilador gera um construtor público de parâmetro único para cada tipo de caso para suportar conversões de união implícita. Um construtor explícito com a mesma forma entra em conflito com esses construtores gerados. Se precisar de um construtor de parâmetro único, torne-o
internalouprivate. - Adicionar um
thisinicializador a qualquer construtor explicitamente declarado para que este se encadeia a um construtor sintetizado ou a outro construtor explicitamente declarado (CS9375). Os construtores gerados pelo compilador inicializam corretamente o armazenamento interno da união. Construtores que não fazem encadeamento entre si podem deixar a união num estado inválido. Use: this(someValue)para encadear a um construtor gerado do tipo de caso, ou: this()para encadear a um construtor explícito sem parâmetros que você declarar.
Requisitos para fornecedores membros da associação
- CS9385: Um tipo de sindicato deve ter pelo menos um membro de criação sindical.
- CS9386: Um tipo de fornecedor de membro union deve ter uma propriedade de instância 'Value' do tipo 'object?' ou 'object'. A propriedade deve ter um acessor 'get' público.
- CS9387: Uma declaração de 'sindicato' não pode usar uma interface de fornecedor membro do sindicato.
Um fornecedor membro de sindicato é um tipo que implementa o padrão sindical através de uma interface em vez da union palavra-chave. Estes erros impõem os requisitos estruturais para os tipos que participam no padrão de fornecedor membro do sindicato. Para as regras completas, consulte a especificação de características de tipos de união.
Para corrigir estes erros, aplique as seguintes alterações ao seu fornecedor membro do sindicato:
- Adicione pelo menos um membro de criação sindical ao tipo (CS9385). Um tipo de união deve expor pelo menos um membro de criação (como um método de fábrica estático ou conversão implícita) para que os valores da união possam ser construídos a partir dos tipos de casos.
- Adicione uma propriedade de instância
Valuepública do tipoobject?ouobjectcom um acessório públicogetao tipo de fornecedor membro (CS9386). A propriedadeValueé a forma como o ambiente de execução obtém o valor armazenado da união. Sem isso, o sindicato não pode expor o seu conteúdo para correspondência de padrões ou acesso direto. - Remover a interface do fornecedor membro do sindicato da
uniondeclaração (CS9387). Umauniondeclaração sintetiza a implementação do seu próprio fornecedor membro. Não pode especificar uma interface de fornecedor membro do sindicato num tipo que use aunionpalavra-chave diretamente. Utilize a interface de fornecedor de membros apenas em tipos que implementem manualmente o padrão de união.
Restrições de hierarquia fechada
-
CS9380: Tipos e pseudónimos não podem ser nomeados
closed. - CS9381: 'tipo': um tipo fechado não pode ser selado nem estático
- CS9382: 'tipo': não pode usar um tipo fechado 'tipo' de outro conjunto como tipo base.
- CS9383:'tipo': O parâmetro de tipo 'parâmetro' deve ser referenciado no tipo base 'tipo' porque o tipo base é fechado.
- CS9384: 'tipo': um tipo fechado não pode ser marcado como abstrato porque é sempre implicitamente abstrato.
Uma hierarquia de tipos fechada restringe quais tipos podem derivar de um tipo base. O compilador aplica estas restrições para garantir que o conjunto de tipos derivados é conhecido e exaustivo. Para as regras completas, consulte a especificação de características de hierarquias fechadas.
Para corrigir estes erros, aplique as seguintes alterações à sua declaração de hierarquia fechada:
- Renomeie qualquer tipo ou alias com o nome
closed, porqueclosedé uma palavra-chave reservada neste contexto (CS9380). Escolha um nome diferente que não conflite com a palavra-chave. - Remova o modificador
sealedoustaticde um tipo fechado (CS9381). Um tipo fechado é implicitamente abstrato (deve ser derivado de), por isso marcá-losealed(que impede a derivação) oustatic(que impede a instanciação e a derivação) contradiz o seu propósito. - Não derive de um tipo fechado declarado noutro conjunto (CS9382). As hierarquias fechadas devem ter todos os seus subtipos definidos na mesma assemblagem que o tipo base. Esta restrição permite ao compilador realizar uma correspondência exaustiva de padrões. Mova o tipo derivado para a mesma assemblagem que o tipo base concretizado, ou remova a relação de herança.
- Certifique-se de que cada parâmetro de tipo de um subtipo genérico aparece na referência do tipo base quando o tipo base está fechado (CS9383). Como uma hierarquia fechada exige um conhecimento exaustivo de todos os subtipos, cada parâmetro de tipo num subtipo deve ser restringido através do tipo base. Se um parâmetro de tipo não for referenciado no tipo base, o compilador não pode enumerar todas as instâncias possíveis.
- Remover o
abstractmodificador de uma declaração de tipo fechado (CS9384). Um tipo fechado é sempre implicitamente abstrato porque serve de base para um conjunto finito de tipos derivados. Adicionarabstractexplicitamente é redundante e proibido para evitar confusão sobre se o tipo tem semântica diferente dos outros tipos fechados.