Perché questo nome con un carattere di sottolineatura non compatibile con CLS?
-
19-09-2019 - |
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;
}
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:
-
Rinomina vostra proprietà (consigliato):
protected bool isNew;
-
Imposta tutta la vostra assemblea per essere non compatibile con CLS:
[assembly: CLSCompliant(false)]
-
Aggiungere un attributo solo per il vostro bene:
[CLSCompliant(false)] protected bool _isNew;
-
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.