Pregunta

¿Por qué recibo el compilador de advertencia

  

Identificador 'Logic.DomainObjectBase._isNew' no es compatible con CLS

En el siguiente código?

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

Solución

Desde el Common Language Specification :

  

Los compiladores de lenguaje compatible con CLS deben seguir las reglas del anexo 7 del Informe Técnico 15 de la Norma Unicode 3.0, que regula el conjunto de caracteres que pueden comenzar y que estén comprendidos en los identificadores. Esta norma está disponible en el sitio Web del Consorcio Unicode.

Si ver esto :

  

Es decir, el primer carácter de un identificador puede ser una letra mayúscula, letra minúscula, letra TitleCase, carta modificador, otra letra, o número de letra. Los caracteres posteriores de un identificador puede ser cualquiera de los, más marcas sin espacio, el espaciamiento de marcas de combinación, números decimales, signos de puntuación de conectores, y los códigos de formato (tales como derecha-izquierda-marca). Normalmente, los códigos de formato deben ser filtrados antes de almacenar o la comparación de los identificadores.

Básicamente, no se puede iniciar un identificador con un guión - que esto viola compatible con CLS en un campo visible (público / protegido)

.

Otros consejos

CLS cumplimiento tiene que ver con la interoperabilidad entre los diferentes .NET idiomas. La propiedad no es compatible con CLS, ya que comienza con un guión y es pública (nota: protected propiedades en una clase pública se puede acceder desde el exterior del conjunto). A pesar de esto funcionará si la propiedad se accede desde C # puede que no si se accede desde otros lenguajes .NET que no permiten guiones al inicio de nombres de propiedades, por lo que no es compatible con CLS.

Usted está recibiendo este error de compilación, porque en algún lugar de su código que ha marcado su ensamblaje en calidad compatible con CLS con una línea como la siguiente:

[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. Cambiar el nombre de su propiedad (recomendado):

    protected bool isNew;
    
  2. Establecer toda la asamblea para ser no compatible con CLS:

    [assembly: CLSCompliant(false)]
    
  3. Añadir un atributo sólo para su propiedad:

    [CLSCompliant(false)]  
    protected bool _isNew;
    
  4. Cambiar el ámbito de la propiedad, por lo que no se puede ver el exterior del conjunto.

    private bool _isNew;
    

El líder subrayado concomitante con _isNew siendo visible (es decir, no privado).

El subrayado causa el problema. La práctica común es que el guión está reservado para los campos privados. protegidas / miembros públicos deben estar debidamente entubados y se nombran.

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 ámbito 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 subrayado. Ver este artículo .

El líder _ es no compatible con CLS

StyleCop analizará su código, y proporcionar enlaces a los documentos que explican por qué relevent no es compatible con CLS.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top