Question

Pourquoi dois-je obtenir l'avertissement compilateur

  

Identifier 'Logic.DomainObjectBase._isNew' est pas conforme CLS

pour le code suivant?

public abstract class DomainObjectBase
{
    protected bool _isNew;
}
Était-ce utile?

La solution

De la Common Language Specification :

  

compilateurs de langages conformes CLS doivent respecter les règles de l'annexe 7 du rapport technique 15 de la norme Unicode 3.0, qui régit l'ensemble des caractères qui peuvent commencer et être inclus dans les identificateurs. Cette norme est disponible sur le site Web du Consortium Unicode.

Si vous regarder ceci haut :

  

C'est, le premier caractère d'un identificateur peut être une lettre majuscule, lettre minuscule, lettre titlecase, lettre de modification, autre lettre, ou le numéro de la lettre. Les caractères suivants d'un identifiant peuvent être l'un quelconque de ceux-ci, ainsi que les marques non-espacement, l'espacement de combinaison des marques, des nombres décimaux, connecteur ponctuations et des codes de mise en forme (comme marque droite-gauche). Normalement, les codes de mise en forme doivent être filtrés avant de ranger ou de comparer des identificateurs.

En fait, vous ne pouvez pas commencer un identifiant avec un trait de soulignement - cela viole CLS conforme sur un champ visible (public / protégée)

.

Autres conseils

CLS conformité doit faire l'interopérabilité entre les différents .NET langues. La propriété est non conforme CLS, car il commence par un trait de soulignement et du public (note: les propriétés protégées dans une classe publique sont accessibles depuis l'extérieur de l'Assemblée). Bien que cela ne fonctionnera que si la propriété est accessible à partir de C # il ne peut pas si elle est accessible à partir d'autres langages .NET qui ne permettent pas underscores au début des noms de propriété, il est donc pas conforme CLS.

Vous obtenez cette erreur du compilateur, parce que quelque part dans votre code que vous avez marqué votre assemblage CLS conforme à une ligne quelque chose comme ceci:

[assembly: CLSCompliant(true)]

Visual Studio comprend cette ligne dans le fichier AssemblyInfo.cs qui se trouve sous Propriétés dans la plupart des projets.

Pour contourner cette erreur, vous pouvez:

  1. Renommer votre propriété (recommandé):

    protected bool isNew;
    
  2. Définir être non conforme CLS votre assemblée:

    [assembly: CLSCompliant(false)]
    
  3. Ajouter un attribut juste votre propriété:

    [CLSCompliant(false)]  
    protected bool _isNew;
    
  4. Modifier la portée de la propriété, de sorte qu'il ne peut pas être vu en dehors de l'ensemble.

    private bool _isNew;
    

Le principal underscore concomitante avec _isNew être visible (et non privé).

Le trait de soulignement provoque le problème. La pratique courante est que le trait de soulignement est réservé aux champs privés. membres protégés / publics doivent être correctement tubé et nommé.

Par exemple:

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

OU, si vous voulez utiliser 3.x et se débarrasser du champ privé:

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

Un identifiant de CLS conforme ne doit pas commencer par un trait de soulignement.

Il est le trait de soulignement. Voir cette article .

Le premier _ est non conforme CLS

StyleCop analysera votre code, et fournir des liens vers les documents expliquant pourquoi il relevent non conforme CLS.

Parce que le nom du membre de données, _isNew, démarrage sur un trait de soulignement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top