Domanda

Perché ricevo l'avviso del compilatore

  

Identifier 'Logic.DomainObjectBase._isNew' non è compatibile con CLS

per il seguente codice?

public abstract class DomainObjectBase
{
    protected bool _isNew;
}
È stato utile?

Soluzione

Common Language Specification :

  

compilatori di linguaggio CLS-compliant devono seguire le regole di cui all'allegato 7 del Technical Report 15 della standard Unicode 3.0, che regola il set di caratteri che possono iniziare ed essere inclusi in identificatori. Questo standard è disponibile dal sito Web del Consorzio Unicode.

Se guardi questo in su :

  

Cioè, il primo carattere di un identificatore può essere una lettera maiuscola, minuscola, lettera Titlecase, lettera modificatore, altra lettera o numero di lettera. I caratteri successivi di un identificatore può essere qualsiasi di quelli, più segni non-spacing, spaziatura segni conciliano, numeri decimali, punteggiatura connettore ei codici di formattazione (come destra-sinistra-mark). Normalmente i codici di formattazione devono essere filtrati prima della conservazione o il confronto identificatori.

In sostanza, non è possibile avviare un identificatore con un underscore - questo viola compatibile con CLS su un campo visibile (pubblico / protetto)

.

Altri suggerimenti

CLS rispetto deve che fare con l'interoperabilità tra le diverse .NET lingue. La proprietà non è compatibile con CLS, perché si inizia con un trattino ed è pubblica (nota: protetto immobili a una classe pubblica si può accedere dall'esterno del montaggio). Anche se questo funzionerà se la proprietà si accede da C # potrebbe non se vi si accede da altri linguaggi .NET che non consentono di sottolineatura all'inizio di nomi di proprietà, quindi non è compatibile con CLS.

Si stanno ottenendo questo errore del compilatore, perché da qualche parte nel codice che avete etichettato l'assembly come compatibile con CLS con una linea simile a questa:

[assembly: CLSCompliant(true)]

Visual Studio include questa riga nel file AssemblyInfo.cs che si trova sotto Proprietà nella maggior parte dei progetti.

Per risolvere questo errore è possibile:

  1. Rinomina vostra proprietà (consigliato):

    protected bool isNew;
    
  2. Imposta tutta la vostra assemblea per essere non compatibile con CLS:

    [assembly: CLSCompliant(false)]
    
  3. Aggiungere un attributo solo per il vostro bene:

    [CLSCompliant(false)]  
    protected bool _isNew;
    
  4. Modificare l'ambito della proprietà, in modo che non può essere visto al di fuori del montaggio.

    private bool _isNew;
    

Il sottolineatura concomitante leader con _isNew essendo visibile (cioè, non privato).

La sottolineatura causa il problema. Pratica comune è che la sottolineatura è riservata ai campi privati. protette / membri pubblici devono essere adeguatamente cased e nominate.

Ad esempio:

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

O, se si desidera utilizzare 3.xe sbarazzarsi del campo privato:

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

Un identificatore CLS-compliant non deve iniziare con un carattere di sottolineatura.

E 'il carattere di sottolineatura. Vedere questo articolo .

Il leader _ è non compatibile con CLS

StyleCop analizzerà il codice e fornire i link ai documenti pertinenti ripresi spiegano il motivo per cui non è compatibile con CLS.

Dato che il nome del membro di dati, _isNew, iniziare di con un underscore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top