Frage

Warum erhalte ich die Compiler-Warnung

  

Identifier 'Logic.DomainObjectBase._isNew' ist nicht CLS-kompatibel

für den folgenden Code?

public abstract class DomainObjectBase
{
    protected bool _isNew;
}
War es hilfreich?

Lösung

Aus der Common Language Specification :

  

CLS-kompatible Sprache Compiler müssen die Regeln des Anhangs 7 des Technical Report 15 des Unicode-Standard 3.0, folgen, die den Zeichensatz regelt, die beginnen und in Identifikatoren enthalten sein. Dieser Standard ist von der Website des Unicode Consortium zur Verfügung.

Wenn Sie diese nachschlagen :

  

Das heißt, das erste Zeichen eines Bezeichners kann ein Großbuchstaben, Kleinbuchstaben, Titlecase Brief, Modifikator Brief, andere Brief oder Brief Zahl sein. Die nachfolgenden Zeichen eines Bezeichners kann jeder von denen sein, plus nicht-spacing Markierungen, Abstand zusammen Markierungen, Dezimalzahlen, connector Interpunktion und Formatierungscodes (wie rechts-links-Markierung). Normalerweise sollten die Formatierungscodes ausgefiltert werden vor dem Speichern oder Vergleichen Identifikatoren.

Grundsätzlich kann man nicht eine Kennung mit einem Unterstrich beginnen -. Dies verstößt gegen compliant CLS auf ein sichtbar (öffentlich / geschützt) Feld

Andere Tipps

CLS-Kompatibilität muss tun mit der Interoperabilität zwischen den verschiedenen .NET Sprachen. Die Eigenschaft ist nicht kompatibel CLS, weil es mit einem Unterstrich beginnt und ist öffentlich (Anmerkung: geschützten Eigenschaften in einer öffentlichen Klasse von außerhalb der Baugruppe zugegriffen werden können). Obwohl dies funktionieren wird, wenn die Eigenschaft von C # zugegriffen wird es nicht, wenn sie von anderen .NET-Sprachen zugegriffen wird, die daher nicht Unterstrichen zu Beginn der Eigenschaftsnamen erlauben, es ist nicht CLS-kompatibel.

Sie diesen Compiler-Fehler bekommen, weil irgendwo in Ihrem Code Sie Ihre Assembly markiert haben als CLS mit einer Linie so etwas wie dies konform:

[assembly: CLSCompliant(true)]

Visual Studio enthält diese Zeile in der AssemblyInfo.cs-Datei, die unter Eigenschaften wird in den meisten Projekten gefunden.

Um diesen Fehler zu umgehen, können Sie entweder:

  1. Benennen Sie Ihre Immobilie (empfohlen):

    protected bool isNew;
    
  2. Stellen Sie Ihre gesamte Baugruppe nicht CLS kompatibel zu sein:

    [assembly: CLSCompliant(false)]
    
  3. Fügen Sie ein Attribut nur, um Ihr Eigentum:

    [CLSCompliant(false)]  
    protected bool _isNew;
    
  4. Ändern Sie den Umfang der Immobilie, so dass es nicht außerhalb der Versammlung gesehen werden kann.

    private bool _isNew;
    

Der führende Strich gleichzeitig mit _isNew sichtbar ist (dh nicht privat).

Der Unterstrich verursacht das Problem. Gängige Praxis ist, dass der Unterstrich für private Felder reserviert ist. geschützt / public-Mitglieder sollten richtig verrohrt und benannt werden.

Zum Beispiel:

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

oder, wenn Sie wollen 3.x verwenden und den privaten Bereichs loszuwerden:

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

Eine CLS-kompatible Kennung sollte nicht mit einem Unterstrich beginnen.

Es ist der Unterstrich. Sehen Sie diese Artikel .

Die führende _ ist nicht CLS-kompatibel

StyleCop wird Ihr Code analysieren und bieten Links zu den relevanten Dokumente zu erklären, warum es nicht kompatibel ist CLS.

Da der Name des Datenelements, _isNew, beginnen die mit einem Unterstrich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top