c# .net cls-compliant

c# - ¿Por qué este nombre con un guión bajo no es compatible con CLS?



.net cls-compliant (8)

De la especificación de lenguaje común :

Los compiladores de lenguaje compatibles con CLS deben seguir las reglas del Anexo 7 del Informe Técnico 15 de la Norma Unicode 3.0, que gobierna el conjunto de caracteres que pueden comenzar y ser incluidos en los identificadores. Este estándar está disponible en el sitio web de Unicode Consortium.

Si buscas esto :

Es decir, el primer carácter de un identificador puede ser una letra mayúscula, una letra minúscula, una letra titlecase, una letra modificadora, otra letra o un número de letra. Los siguientes caracteres de un identificador pueden ser cualquiera de ellos, más las marcas sin espacio, las marcas de espaciado, los números decimales, las puntuaciones de los conectores y los códigos de formato (como la marca derecha-izquierda). 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).

¿Por qué recibo la advertencia del compilador?

El identificador ''Logic.DomainObjectBase._isNew'' no es compatible con CLS

para el siguiente código?

public abstract class DomainObjectBase { protected bool _isNew; }


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


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


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

Por ejemplo:

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

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

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


El líder _ no es compatible con CLS

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



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


El cumplimiento de CLS tiene que ver con la interoperabilidad entre los diferentes lenguajes .NET . La propiedad no es compatible con CLS, ya que 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 si se accede desde otros lenguajes .NET que no permiten guiones bajos al inicio de los nombres de propiedad, por lo tanto, no es compatible con CLS.

Recibes este error del compilador, porque en algún lugar de tu código has etiquetado a tu ensamblaje como compatible con CLS con una línea como esta:

[assembly: CLSCompliant(true)]

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

Para evitar este error puede:

  1. Renombra tu propiedad (recomendado):

    protected bool isNew;

  2. Configure todo su ensamblaje 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 alcance de la propiedad para que no se vea fuera del ensamblaje.

    private bool _isNew;