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.
O compilador C# gera erros quando você usa indevidamente tipos de união ou hierarquias de tipo fechado. Um tipo de união representa um valor que pode ser um dos vários tipos de casos, com conversões implícitas e correspondência de padrões exaustivos. Hierarquias fechadas restringem quais tipos podem derivar de um tipo base. Esses diagnósticos ajudam você a seguir as regras para declarar e usar tipos de união e hierarquias fechadas.
- CS9370: uma declaração de união deve especificar pelo menos um tipo de caso.
- CS9371: não é possível converter o tipo "type" em objeto por meio de uma referência implícita ou conversão boxing.
- CS9373: campos de instância, propriedades automáticas ou eventos semelhantes a um campo não são permitidos em uma declaração "union".
- CS9374: Construtores públicos declarados explicitamente com um único parâmetro não são permitidos em uma declaração "union".
- CS9375: um construtor declarado em uma declaração "union" deve ter um inicializador "this" que chama um construtor sintetizado ou um construtor declarado explicitamente.
- CS9380: tipos e aliases não podem ser nomeados como "fechados".
- CS9381: 'type': um tipo fechado não pode ser lacrado ou estático
- CS9382: 'type': não é possível usar um tipo fechado 'type' de outro assembly como um tipo base.
- CS9383: 'type': o parâmetro de tipo 'parameter' deve ser referenciado no tipo base 'type' porque o tipo base está fechado.
- CS9384: 'type': 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 do sindicato.
- CS9386: um tipo de provedor de membro de união deve ter uma propriedade de instância 'Value' do tipo 'object?' ou 'object'. A propriedade deve ter um acessador get público.
- CS9387: uma declaração de 'union' não pode usar uma interface de provedor de membro de união.
Requisitos de declaração da união
- CS9370: uma declaração de união deve especificar pelo menos um tipo de caso.
- CS9371: não é possível converter o tipo "type" em objeto por meio de uma referência implícita ou conversão boxing.
Uma declaração de união especifica um nome e uma lista de tipos de caso. Esses erros impõem os requisitos estruturais de uma declaração de união válida. Para obter as regras completas, consulte a especificação do recurso de tipos de união.
Para corrigir esses erros, aplique as seguintes alterações à declaração de união:
- Adicione pelo menos um tipo de caso à lista de tipos da união (CS9370). Um sindicato deve ter um ou mais tipos de casos porque a finalidade do sindicato é representar um conjunto fechado de alternativas. Uma declaração como
union Empty()sem tipos de casos não faz sentido. - Altere ou remova os tipos de caso que não são convertidos para
objectpor meio de uma referência implícita ou conversão boxing (CS9371). Os tipos union armazenam seus respectivos conteúdos como uma única referênciaobject?; portanto, cada tipo de caso deve ser conversível paraobject. Tipos, como ponteiros ouref struct, não atendem a esse requisito. Substitua-os por um tipo de wrapper que possa ser encaixotado ou armazenado como referência.
Restrições de membros do sindicato
- CS9373: campos de instância, propriedades automáticas ou eventos semelhantes a um campo não são permitidos em uma declaração "union".
- CS9374: Construtores públicos declarados explicitamente com um único parâmetro não são permitidos em uma declaração "union".
- CS9375: Um construtor declarado em uma declaração 'union' deve ter um inicializador 'this' que chama um construtor sintetizado ou um construtor declarado explicitamente.
Uma declaração de união pode incluir um corpo com membros adicionais, mas o compilador restringe o que você pode declarar. Essas restrições garantem que os construtores de conversão gerados pelo compilador e o mecanismo de armazenamento funcionem corretamente. Para obter as regras completas, consulte a especificação do recurso de tipos de união.
Para corrigir esses erros, aplique as seguintes alterações aos membros do sindicato:
- Remova os campos de instância, as propriedades implementadas automaticamente e os eventos semelhantes a campos do corpo do union (CS9373). Uma união não define novos membros de dados. Ele compõe os tipos existentes em um conjunto fechado de alternativas. Declare estados adicionais nos próprios tipos de caso ou use membros estáticos no union.
- Remova ou altere a acessibilidade de qualquer construtor público explicitamente declarado que usa um único parâmetro (CS9374). O compilador gera um construtor público de parâmetro único para cada tipo de caso para dar suporte a conversões de união implícitas. Um construtor explícito com a mesma forma entra em conflito com esses construtores gerados. Se você precisar de um construtor de parâmetro único, faça isso
internalouprivate. - Adicione um
thisinicializador a qualquer construtor declarado explicitamente para que ele seja encadeado a um construtor sintetizado ou a outro construtor declarado explicitamente (CS9375). Os construtores gerados pelo compilador inicializam corretamente o armazenamento interno da união. Construtores que não os encadeiam podem deixar o union em um estado inválido. Use: this(someValue)para encadear um construtor de tipo de caso gerado ou: this()para encadear um construtor sem parâmetros explícito que você declara.
Requisitos do prestador membro do sindicato
- CS9385: Um tipo de união deve ter pelo menos um membro de criação do sindicato.
- CS9386: um tipo de provedor de membro de união deve ter uma propriedade de instância 'Value' do tipo 'object?' ou 'object'. A propriedade deve ter um acessador get público.
- CS9387: uma declaração de 'union' não pode usar uma interface de provedor de membro de união.
Um provedor de membro de união é um tipo que implementa o padrão de união por meio de uma interface em vez da palavra-chave union. Esses erros impõem os requisitos estruturais para tipos que participam do padrão de provedor membro de união. Para obter as regras completas, consulte a especificação do recurso de tipos de união.
Para corrigir esses erros, aplique as seguintes alterações ao seu provedor membro do sindicato:
- Adicione pelo menos um membro de criação do sindicato 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 uma conversão implícita) para que os valores da união possam ser construídos a partir dos tipos de caso.
- Adicione uma propriedade de instância
Valuepública do tipoobject?ouobjectcom um acessador públicogetao tipo de provedor membro (CS9386). A propriedadeValueé a forma como o runtime recupera o valor armazenado da union. Sem ele, a união não pode expor seu conteúdo para correspondência de padrões ou acesso direto. - Remova a interface do provedor de membro de união da declaração
union(CS9387). Uma declaraçãounionsintetiza sua própria implementação de provedor de membro. Você não pode especificar uma interface de provedor de membro de união em um tipo que usa a palavra-chaveuniondiretamente. Use a interface do provedor de membro somente em tipos que implementam o padrão de união manualmente.
Restrições de hierarquia fechadas
-
CS9380: Tipos e aliases não podem ser nomeados
closed. - CS9381: 'type': um tipo fechado não pode ser selado ou estático
- CS9382: 'type': não é possível usar um tipo fechado 'type' de outro assembly como um tipo base.
- CS9383: 'type': o parâmetro de tipo 'parameter' deve ser referenciado no tipo base 'type' porque o tipo base está fechado.
- CS9384: 'type': um tipo fechado não pode ser marcado como abstrato porque é sempre implicitamente abstrato.
Uma hierarquia de tipo fechado restringe quais tipos podem derivar de um tipo base. O compilador impõe essas restrições para garantir que o conjunto de tipos derivados seja conhecido e exaustivo. Para obter as regras completas, consulte a especificação de recurso de hierarquias fechadas.
Para corrigir esses erros, aplique as seguintes alterações à declaração de hierarquia fechada:
- Renomeie qualquer tipo ou alias nomeado
closed, porqueclosedé uma palavra-chave reservada neste contexto (CS9380). Escolha um nome diferente que não entre em conflito com a palavra-chave. - Remova o modificador
sealedoustaticde um tipo fechado (CS9381). Um tipo fechado é implicitamente abstrato (deve ser derivado), portanto, marcá-losealed(que impede a derivação) oustatic(que impede a instanciação e a derivação) contradiz sua finalidade. - Não faça a derivação de um tipo fechado declarado em outro assembly (CS9382). As hierarquias fechadas devem ter todos os seus subtipos definidos no mesmo assembly que o tipo base. Essa restrição permite que o compilador execute uma correspondência completa de padrões. Mova o tipo derivado para o mesmo assembly que o tipo base fechado, ou remova a relação de herança.
- Verifique se cada parâmetro de tipo de um subtipo genérico aparece na referência de tipo base quando o tipo base é fechado (CS9383). Como uma hierarquia fechada requer conhecimento exaustivo de todos os subtipos, cada parâmetro de tipo em um subtipo deve ser restringido por meio do tipo base. Se um parâmetro de tipo não for referenciado no tipo base, o compilador não poderá enumerar todas as instâncias possíveis.
- Remova o
abstractmodificador de uma declaração de tipo fechado (CS9384). Um tipo fechado é sempre implicitamente abstrato porque serve como base para um conjunto finito de tipos derivados. Adicionarabstractexplicitamente é redundante e não permitido para evitar confusão sobre se o tipo tem semântica diferente de outros tipos fechados.