¿Por qué este nombre con un guión bajo no cumple con CLS?

¿Por qué recibo la advertencia del comstackdor?

El identificador ‘Logic.DomainObjectBase._isNew’ no cumple con CLS

para el siguiente código?

public abstract class DomainObjectBase { protected bool _isNew; } 

De la especificación de lenguaje común :

Los comstackdores de lenguaje que cumplen con CLS deben seguir las reglas del Anexo 7 del Informe técnico 15 del Estándar Unicode 3.0, que rige el conjunto de caracteres que pueden iniciarse y ser incluidos en los identificadores. Este estándar está disponible en el sitio web del Consorcio Unicode.

Si miras esto :

Es decir, el primer carácter de un identificador puede ser una letra mayúscula, una letra minúscula, una letra de encabezado, una letra modificadora, otra letra o un número de letra. Los caracteres subsiguientes de un identificador pueden ser cualquiera de esos, más marcas que no estén espaciadas, marcas de combinación de espaciado, números decimales, puntuaciones de conector y códigos de formato (como la marca de izquierda a derecha). Normalmente, los códigos de formato deben filtrarse antes de almacenar o comparar identificadores.

Básicamente, no puede iniciar un identificador con un guión bajo: esto viola el cumplimiento de CLS en un campo visible (público / protegido).

El cumplimiento de CLS tiene que ver con la interoperabilidad entre los diferentes lenguajes .NET . La propiedad no es compatible con CLS, porque comienza con un guión bajo y es pública (nota: se puede acceder a las propiedades protegidas en una clase pública desde fuera del ensamblaje). Aunque esto funcionará si se accede a la propiedad desde C #, puede que no se acceda desde otros lenguajes .NET que no permiten caracteres de subrayado al comienzo de los nombres de propiedad, por lo tanto, no es compatible con CLS.

Está obteniendo este error de comstackción, porque en algún lugar de su código ha etiquetado su ensamblaje como CLS que cumple con una línea como esta:

 [assembly: CLSCompliant(true)] 

Visual Studio incluye esta línea en el archivo AssemblyInfo.cs que se puede encontrar en Propiedades en la mayoría de los proyectos.

Para evitar este error, puede:

  1. Cambie el nombre de su propiedad (recomendado):

     protected bool isNew; 
  2. Configure su ensamblaje completo para que no sea compatible con CLS:

     [assembly: CLSCompliant(false)] 
  3. Agregue un atributo solo a su propiedad:

     [CLSCompliant(false)] protected bool _isNew; 
  4. Cambie el scope de la propiedad, de modo que no pueda verse fuera del ensamblaje.

     private bool _isNew; 

El subrayado _isNew concomitante con _isNew es visible (es decir, no privado).

El guión bajo causa el problema. La práctica común es que el subrayado está reservado para campos privados. los miembros protegidos / públicos deben estar debidamente cubiertos y nombrados.

Por ejemplo:

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

O bien, si desea utilizar 3.x y deshacerse del campo privado:

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

Un identificador compatible con CLS no debe comenzar con un guión bajo.

Es el guión bajo. Vea este artículo .

El líder _ no cumple con CLS

Microsoft StyleCop analizará su código y proporcionará enlaces a los documentos relevantes explicando por qué no cumple con CLS.

Porque el nombre del miembro de datos, _isNew , comienza con un guión bajo.