2009-06-02 12 views
5

Tengo un proyecto .NET 3.5 C# que tiene un espacio de nombre de SampleNamespace.Tools.Sample.El nombre de referencia no es compatible con CLS

Si añado un montaje llamado "Samplenamespace.Utils.Example" a mi proyecto me sale el siguiente aviso:

Identificador 'Samplenamespace' difiriendo sólo en caso de que no es compatible con CLS

Tenga en cuenta la minúscula 'n' en Samplenamespace.

Ni siquiera estoy usando el ensamblaje de referencia en mi proyecto en este momento. Simplemente agregarlo como referencia causa la advertencia.

¿Por qué el compilador se queja de esto considerando que no estoy exponiendo ninguna referencia al ensamblado en mis clases públicas?

¿Alguna solución alternativa?

Respuesta

7

No todos los lenguajes .NET son sensibles a mayúsculas y minúsculas (VB, por ejemplo) cuando ha mezclado espacios de nombres como este, difiriendo solo en caso (para usar la redacción de la advertencia) su código puede no ser accesible para otros desarrolladores.

Eso no puede ser su caso, que es por eso que es una advertencia (que en mi tienda tratamos como un error)

+0

Gracias Ralph, todavía no entiendo por qué esto debería importar ya que mi proyecto no está exponiendo nada del ensamblado al que se hace referencia a ningún cliente potencial de VB. Estoy efectivamente abstrayendo el cliente VB del ensamblaje subyacente? – user115909

+0

Dado que VB no distingue entre mayúsculas y minúsculas, no puede diferenciar entre SampleNamespace.A y Samplenamespace.A y, por lo tanto, no puede determinar qué tipo invocar. Para evitar dicha ambigüedad, el Compilador de C# marca esto para que solo pueda crear tipos y miembros que puedan ser invocados por todos sin ninguna ambigüedad. – Gishu

+0

Creo que es un indicador ciego, no está considerando cómo está usando o exponiendo los tipos. – Gishu

2

Está simplemente le advierte ya que no todos los idiomas que pueden consumir los tipos dentro de su solución se tenga en cuenta la diferencia (y es posible que no pueda usar los tipos).

creo que se puede evitar esta advertencia marcando su montaje como no compatible con CLS (en el archivo de AssemblyInfo.cs) (read more here):

[assembly:CLSCompliant(false)] 

No estoy seguro creo que es una buena idea sin embargo ...

Actualización: Creo que la razón por la que se emite la advertencia aunque nada se expone públicamente es porque los espacios de nombres no tienen modificadores de acceso. Quizás pueda decir que los espacios de nombres son siempre públicos, por lo que son expuestos a clientes potenciales, aunque es posible que no contengan ningún tipo de público.

+0

Fredrik, podría hacer que el código no sea compatible con CLS, pero preferiría no tener en cuenta que cualquier código de cliente de mi aplicación no esté expuesto a este ensamblaje. Simplemente no parece una situación válida para romper CLS-Compliance. – user115909

+0

También me puse curioso e hice algunas pruebas; ver mi actualización en la respuesta. –

+0

Eso hace desde Fredrik. Supongo que mis únicas opciones son cambiar el espacio de nombres o establecer el cumplimiento de CLS en falso. Gracias por tu ayuda – user115909

Cuestiones relacionadas