Pergunta

Por que recebo o aviso do compilador

Identificador 'Logic.DomainObjectBase._isNew' não é compatível com CLS

para o seguinte código?

public abstract class DomainObjectBase
{
    protected bool _isNew;
}
Foi útil?

Solução

A partir da Especificação Common Language :

compiladores de linguagem compatível com CLS devem seguir as regras do anexo 7 do Relatório Técnico 15 do Padrão Unicode 3.0, que rege o conjunto de caracteres que podem começar e ser incluídos em identificadores. Esta norma está disponível no site do Consórcio Unicode.

Se você pesquisar sobre o assunto :

Isto é, o primeiro caractere de um identificador pode ser uma letra maiúscula, letra minúscula, letra titlecase, carta modificador, outra letra ou número de letra. Os caracteres subsequentes de um identificador pode ser qualquer um dos, além de não-espaçamento marcas, o espaçamento entre marcas, que combinam números decimais, pontuações de conector, e formatação de códigos (tais como a marca para a direita-esquerda). Normalmente, os códigos de formatação deve ser filtrado antes de armazenar ou comparar identificadores.

Basicamente, você não pode iniciar um identificador com um sublinhado -. Isso viola compatível com CLS em um campo visível (público / protegido)

Outras dicas

CLS conformidade tem que ver com a interoperabilidade entre as diferentes línguas .NET . A propriedade não é compatível com CLS, porque começa com um sublinhado e é público (nota: protected propriedades em uma classe pública pode ser acessado de fora da montagem). Embora isso vai funcionar se a propriedade é acessado a partir C # pode não se ele for acessado a partir de outras linguagens .NET que não permitem sublinhados no início de nomes de propriedades, portanto, não é compatível com CLS.

Você está recebendo este erro compilador, porque em algum lugar em seu código de ter marcado a sua montagem como compatível com CLS com uma linha algo como isto:

[assembly: CLSCompliant(true)]

Visual Studio inclui esta linha no arquivo AssemblyInfo.cs que pode ser encontrado em Propriedades na maioria dos projetos.

Para contornar este erro, você pode:

  1. Renomear sua propriedade (recomendado):

    protected bool isNew;
    
  2. Definir toda a sua montagem para ser não compatível com CLS:

    [assembly: CLSCompliant(false)]
    
  3. Adicionar um atributo apenas para sua propriedade:

    [CLSCompliant(false)]  
    protected bool _isNew;
    
  4. Alterar o escopo da propriedade, de modo que não pode ser visto fora da montagem.

    private bool _isNew;
    

O líder sublinhado concomitante com _isNew sendo visível (ou seja, não privada).

O sublinhado causa o problema. A prática comum é que o sublinhado é reservada para campos particulares. protegidas / membros públicos devem ser devidamente encaixotado e nomeado.

Por exemplo:

public abstract class DomainObjectBase{   
   private bool _isNew;
   protected bool IsNew { get { return _isNew; } set { _isNew = value;} }
}

ou, se você quiser usar 3.x e livrar-se do campo privado:

public abstract class DomainObjectBase{   
   protected bool IsNew { get; set; }
}

Um identificador compatível com CLS não deve começar com um sublinhado.

É o sublinhado. Veja este artigo .

O líder _ não é compatível com CLS

StyleCop irá analisar o seu código, e fornecer links para os documentos relevent explicando por que não é compatível com CLS.

Como o nome do membro de dados, _isNew, começar de com um sublinhado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top