2010-05-29 5 views

Respuesta

7

CLS significa Common Language Specification. Para simplificar, básicamente son los tipos e identificadores mínimos que todos los lenguajes .NET deben conocer. Por ejemplo, Int32 es CLS-obediente: cualquier lengua de .NET debe poder manejarlo. UInt32 no es. Como su código es privado, otros ensamblados no podrán acceder a él en otros idiomas, por lo que no importa si es compatible con CLS o no.

Consulte this MSDN page para obtener más información sobre el cumplimiento de CLS.

Edit: Creo que malinterpretas qué es el cumplimiento de CLS. No se trata de si el código se puede compilar en IL o no. UInt32 se puede usar en IL. Lo mismo ocurre con un identificador llamado '©'. El cumplimiento de CLS es solo un contrato mínimo para la interoperabilidad del lenguaje. Lo que CLR admite es mucho más amplio que las limitaciones para el cumplimiento de CLS.

Edit2: Sí, tienes razón. Se requiere un lenguaje .NET para admitir Int32, no UInt32, incluso si tiene una asignación directa a IL. Ver punteros, son compatibles con IL y C# pero no cumplen con CLS. VB.NET no implementa un soporte para ellos y aún cumple con CLS.

+0

Lo que entiendo es: si algo es CLS compatible, entonces es porque IL lo admite, porque todo se convertirá en IL cuando se compile. Cuando UInt32 no cumple con CLS, entonces, ¿qué importa si se trata de una implementación privada o pública, porque no hay forma de que se compile en IL? – teenup

+0

Lo siento, creo que estoy haciendo preguntas ridículas, pero si UInt32 es compatible con CTS (es decir, también con IL), ¿por qué no lo han hecho? Es decir, si devuelvo un UInt32 de uno de mis métodos en un idioma, ¿por qué no puede otro idioma llamar a este método y aceptar el valor de retorno? ¿Puede otro idioma no utilizar directamente System.UInt32 y no es necesario que su compilador admita un tipo de datos que se correlacionará con UInt32 de.NET Framework ? – teenup

2

No - El CLR no necesita saber qué está pasando debajo del capó. Necesita tener solo sus clases públicas y miembros públicos/privados de esas clases públicas para cumplir con CLS, nunca se accederá al código de descanso; seguirá siendo inaccesible para otros idiomas que usan sus clases.

+0

p. las variables son sensibles a las mayúsculas y minúsculas en Visual Basic, y tomo dos variables con diferencias de casos solamente, que no es compatible con cls y las pongo dentro del alcance de una función privada. Ahora cuando ejecuto mi aplicación, se convertirá en IL. Ahora, cuando IL no admite variables con diferencias de casos solamente, estas dos variables de diferencias se tomarán como una sola misma variable. – teenup

+0

CLS dice: El código no debe exponer dos nombres (identificadores) que difieran solo en su caso. Y el compilador de VB.Net no le permite compilar la fuente que dice: '' La variable local ya está declarada en el bloque actual'' –

+0

@Pundeet Creo que quiere decir que VB es un caso ** insensible **. En VB declarar variables que difieren por caso solo en el mismo ámbito, como this._curious_geek señala, dará como resultado un error de compilación. –

1

El único objetivo real de CLS es garantizar que cualquier lenguaje compatible pueda interactuar con cualquier clase compatible, independientemente del idioma en el que fue escrito, porque la API de esa clase requiere solo cosas que todos los idiomas deben admitir. Por lo tanto, "Especificación de lenguaje común".

Semi obviamente, la API privada es (o al menos, debería ser) invisible fuera de su propio código, por lo que no importa si es compatible con CLS o no.

1

Si es compatible con CLS que significa cada lenguaje .NET necesidad apoya.
Si es representable en IL eso significa que algunos .NET pueden apoyarlo.

Uno representa un requisito de los lenguajes .NET y el otro representa lo que es posible en los lenguajes .NET.

Cuestiones relacionadas