web-dev-qa-db-fra.com

Pourquoi ce nom avec un trait de soulignement n'est-il pas conforme CLS?

Pourquoi reçois-je l'avertissement du compilateur

L'identifiant "Logic.DomainObjectBase._isNew" n'est pas compatible CLS

pour le code suivant?

public abstract class DomainObjectBase
{
    protected bool _isNew;
}
54
MatthewMartin

De la Common Language Specification :

Les compilateurs de langage conformes à CLS doivent suivre les règles de l'annexe 7 du rapport technique 15 de la norme Unicode 3.0, qui régit le jeu de caractères qui peut commencer et être inclus dans les identificateurs. Cette norme est disponible sur le site Web du Consortium Unicode.

Si vous regardez ceci :

En d'autres termes, le premier caractère d'un identifiant peut être une lettre majuscule, une lettre minuscule, une lettre majuscule, une lettre modificatrice, une autre lettre ou un numéro de lettre. Les caractères suivants d'un identifiant peuvent être n'importe lequel de ces caractères, plus les marques sans espacement, les marques de combinaison d'espacement, les nombres décimaux, les signes de ponctuation des connecteurs et les codes de formatage (tels que les marques droite-gauche). Normalement, les codes de formatage doivent être filtrés avant de stocker ou de comparer les identifiants.

Fondamentalement, vous ne pouvez pas démarrer un identifiant avec un trait de soulignement - cela viole CLS conforme sur un champ visible (public/protégé).

80
Reed Copsey

Conformité CLS concerne l'interopérabilité entre les différentes langues . NET . La propriété n'est pas compatible CLS, car elle commence par un trait de soulignement et est publique (remarque: les propriétés protégées dans une classe publique sont accessibles depuis l'extérieur de l'assembly). Bien que cela fonctionne si la propriété est accessible à partir de C #, il se peut que ce ne soit pas le cas si elle est accessible à partir d'autres langages .NET qui n'autorisent pas les traits de soulignement au début des noms de propriété, elle n'est donc pas conforme CLS.

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

[Assembly: CLSCompliant(true)]

Visual Studio inclut 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 soit:

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

    protected bool isNew;
    
  2. Définissez l'ensemble de votre ensemble pour qu'il ne soit pas conforme CLS:

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

    [CLSCompliant(false)]  
    protected bool _isNew;
    
  4. Modifiez l'étendue de la propriété afin qu'elle ne soit pas visible en dehors de l'assembly.

    private bool _isNew;
    
40
Martin Brown

Le premier souligné concomitant avec _isNew être visible (c'est-à-dire non privé).

28
jason

Le trait de soulignement cause le problème. La pratique courante est que le trait de soulignement est réservé aux champs privés. les membres protégés/publics doivent être correctement encadré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 souhaitez utiliser 3.x et vous débarrasser du champ privé:

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

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

2
Lloyd

C'est le trait de soulignement. Voir ceci article .

1
Tim Stewart

Le premier _ n'est pas compatible CLS

Microsoft StyleCop analysera votre code et fournira des liens vers les documents pertinents expliquant pourquoi il n'est pas conforme CLS.

1
Frozenskys

Étant donné que le nom du membre de données, _isNew, commence par un trait de soulignement.

0
TcKs