2009-06-02 19 views
5

Ho un progetto .NET 3.5 C# che ha uno spazio dei nomi di SampleNamespace.Tools.Sample.Nome di riferimento Il caso non è conforme a CLS

Se posso aggiungere un assembly chiamato "Samplenamespace.Utils.Example" per il mio progetto ottengo il seguente avvertimento:

Identifier 'Samplenamespace' che differiscono solo nel caso in cui non è compatibile con CLS

Notare la lettera minuscola 'n' in Samplenamespace.

Al momento non sto nemmeno utilizzando l'assembly di riferimento nel mio progetto. Semplicemente aggiungendolo come riferimento provoca l'avviso.

Perché il compilatore si lamenta di questo considerando che non sto nemmeno esponendo alcun riferimento all'assembly nelle mie classi pubbliche?

Qualsiasi soluzione alternativa?

risposta

7

Non tutti i linguaggi .NET fanno distinzione tra maiuscole e minuscole (ad esempio VB) quando si hanno spazi dei nomi misti come questo, diffondendo solo nel caso (per usare la dicitura dell'avviso) il proprio codice potrebbe non essere accessibile ad altri sviluppatori.

che non possono essere il vostro caso, che è per questo che è un avvertimento (che nel mio negozio trattiamo come un errore)

+0

Grazie Ralph, non riesco ancora a capire perché questo dovrebbe avere importanza dal momento che il mio progetto non espone nulla dall'associazione referenziata a nessun potenziale client VB. Sto effettivamente astrarre il client VB dall'assieme sottostante? – user115909

+0

Poiché VB non fa distinzione tra maiuscole e minuscole, non è in grado di distinguere tra SampleNamespace.A e Samplenamespace.A e quindi non è in grado di determinare il tipo da richiamare. Per evitare tale ambiguità, il compilatore C# lo contrassegna in modo da poter creare solo tipi e membri che possono essere invocati da chiunque senza alcuna ambiguità. – Gishu

+0

Penso che sia un check-and-flag cieco, non sta considerando come stai effettivamente usando o esponendo i tipi. – Gishu

2

E 'semplicemente in guardia dal momento che non tutte le lingue che possono consumare i tipi all'interno della vostra soluzione essere consapevoli della differenza (e potrebbe non essere in grado di utilizzare i tipi).

penso che si può evitare questo avviso contrassegnando l'assembly come non compatibile con CLS (nel file AssemblyInfo.cs) (read more here):

[assembly:CLSCompliant(false)] 

Non sono sicuro penso che sia una buona idea anche se ...

Aggiornamento: Penso che il motivo per cui l'avviso viene emesso anche se nulla è esposto pubblicamente è che gli spazi dei nomi non hanno modificatori di accesso. Potresti forse dire che gli spazi dei nomi sono sempre pubblici, quindi sono esposti a potenziali clienti,, anche se non possono contenere tipi pubblici.

+0

Fredrik, potrei rendere il codice nessuno conforme a CLS ma preferirei non considerare che nessun codice client della mia app sia esposto a questo assembly. Semplicemente non sembra una situazione valida per rompere la conformità alla CLS. – user115909

+0

Anch'io sono curioso e ho fatto alcuni test; vedi il mio aggiornamento nella risposta. –

+0

Questo succede da quando Fredrik. Suppongo che le mie uniche opzioni siano modificare lo spazio dei nomi o impostare la conformità CLS su false. Grazie per il tuo aiuto – user115909

Problemi correlati