55 votes

Pourquoi ce nom n'est-il pas conforme aux normes CLS ?

Pourquoi ai-je l'avertissement du compilateur

L'identificateur 'Logic.DomainObjectBase._isNew' n'est pas conforme à la norme CLS.

pour le code suivant ?

public abstract class DomainObjectBase
{
    protected bool _isNew;
}

80voto

Reed Copsey Points 315315

De la Spécification du langage commun :

Les compilateurs de langage conformes à la norme 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 pouvant commencer et être inclus dans les identifiants. Cette norme est disponible sur le site Web du Consortium Unicode.

Si vous regardez ça :

En d'autres termes, le premier caractère d'un identifiant peut être une lettre majuscule, une lettre minuscule, une lettre de titre, une lettre modificatrice, une autre lettre ou un nombre de lettres. Les caractères suivants d'un identificateur peuvent être n'importe lesquels de ces caractères, plus des marques de non-espacement, des marques de combinaison d'espacement, des nombres décimaux, des ponctuations de connexion et des codes de formatage (tels que la marque droite-gauche). Normalement, les codes de formatage doivent être filtrés avant de stocker ou de comparer les identificateurs.

Fondamentalement, vous ne pouvez pas commencer un identifiant par un trait de soulignement - cela viole la conformité CLS sur un champ visible (public/protégé).

40voto

Martin Brown Points 8593

Conformité CLS a à voir avec l'interopérabilité entre les différentes .NET langues. La propriété n'est pas conforme à CLS, car elle commence par un trait de soulignement et est publique (remarque : les propriétés protégées d'une classe publique sont accessibles depuis l'extérieur de l'assemblage). Bien que cela fonctionne si l'on accède à la propriété depuis C#, il se peut que cela ne fonctionne pas si l'on y accède depuis d'autres langages .NET qui n'autorisent pas les traits de soulignement au début des noms de propriétés, d'où sa non-conformité au CLS.

Vous obtenez cette erreur de compilation, car quelque part dans votre code, vous avez étiqueté votre assemblage comme étant conforme à la norme CLS avec une ligne comme celle-ci :

[assembly: CLSCompliant(true)]

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

Pour contourner cette erreur, vous pouvez soit :

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

    protected bool isNew;
  2. Paramétrez l'ensemble de votre assemblage pour qu'il ne soit pas conforme aux normes CLS :

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

    [CLSCompliant(false)]  
    protected bool _isNew;
  4. Changez la portée de la propriété, de sorte qu'elle ne puisse pas être vue en dehors de l'assemblage.

    private bool _isNew;

28voto

Jason Points 125291

Le leader soulignement en même temps que _isNew être visible (c'est-à-dire non privée).

7voto

Chris Lively Points 59564

Le trait de soulignement est à l'origine du problème. La pratique courante veut que le trait de soulignement soit réservé aux champs privés. Les membres protégés / publics doivent être correctement casés et nommés.

Par exemple :

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

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

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

2voto

Lloyd Points 1138

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X