Common Language Specification

Actualización: noviembre 2007

Para poder interactuar completamente con otros objetos, sea cual sea el lenguaje en que se hayan implementado, los objetos deben exponer a los llamadores sólo aquellas características que sean comunes para todos los lenguajes con los que deben interoperar. Por este motivo, se ha definido Common Language Specification (CLS), que es un conjunto de características de lenguaje básicas requeridas por la mayoría de las aplicaciones. Las reglas de CLS definen un subconjunto del Sistema de tipos comunes, es decir, todas las reglas que se aplican al sistema de tipos común se aplican también a CLS, salvo que se definan reglas más estrictas en CLS. CLS ayuda a mejorar y garantizar la interoperabilidad entre lenguajes mediante la definición de un conjunto de características en las que se pueden basar los programadores y que están disponibles en una gran variedad de lenguajes. CLS también establece los requisitos de compatibilidad con CLS; estos requisitos permiten determinar si el código administrado cumple la especificación CLS y hasta qué punto una herramienta dada admite la programación de código administrado que utilice las características de CLS.

Si un componente sólo utiliza las características de CLS en la API que expone a otro código (incluidas las clases derivadas), se garantiza que se puede obtener acceso al componente desde cualquier lenguaje de programación que admita CLS. Los componentes que cumplen las reglas de CLS y usan sólo las características incluidas en CLS se conocen como componentes compatibles con CLS.

La mayoría de los miembros definidos por tipos en Información general de la biblioteca de clases de .NET Framework son compatibles con CLS. Sin embargo, algunos tipos de la biblioteca de clases tienen uno o más miembros que no son compatibles con CLS. Estos miembros permiten el uso de características de lenguaje que no se encuentran en CLS. Los tipos y miembros que no son compatibles con CLS se identifican como tales en la documentación de referencia y, en todos los casos, existe una alternativa compatible con CLS. Para obtener más información sobre los tipos de la biblioteca de clases de .NET Framework, vea Referencia de la biblioteca de clases de .NET Framework.

CLS se diseñó de manera que fuese lo suficientemente amplio como para incluir las construcciones de lenguaje que normalmente necesitan los programadores y lo suficientemente pequeño como para que todos los lenguajes pudieran admitirlo. Además, se ha excluido de CLS cualquier construcción de lenguaje de la que no se puede verificar rápidamente la seguridad de tipos del código, de manera que todos los lenguajes compatibles con CLS pueden generar código que es posible comprobar. Para obtener más información sobre la comprobación de la seguridad de tipos, vea Compilar MSIL a código nativo.

En la tabla siguiente, se resumen las características que se incluyen en CLS y se indica si cada característica se aplica a programadores y compiladores (Todos) o sólo a compiladores. Se pretende que sea informativa, pero no detallada. Para obtener información detallada, consulte la especificación de Common Language Infrastructure, Partition I, disponible en el sitio web Microsoft Developer Network.

Característica

Se aplica a

Descripción

General

   

   

Visibilidad

Todo

Las reglas de CLS se aplican sólo a las partes de un tipo que se expongan fuera del ensamblado que realiza la definición.

Miembros globales

Todo

Los campos y métodos static globales no son compatibles con CLS.

Nombres

   

   

Caracteres y mayúsculas

Todo

Los compiladores de lenguaje compatibles con CLS deben seguir las reglas del anexo 7 del informe técnico 15 del estándar Unicode 3.0, que controla el conjunto de caracteres que pueden iniciar e incluirse en los identificadores. Este estándar está disponible en el sitio web de Unicode Consortium.

Para que dos identificadores se consideren distintos, deben diferenciarse por algo más que el uso de mayúsculas o minúsculas.

Keywords

Compiladores

Los compiladores de lenguajes compatibles con CLS proporcionan un mecanismo para hacer referencia a identificadores que coinciden con palabras clave. Los compiladores de lenguajes compatibles con CLS proporcionan un mecanismo para definir y reemplazar los métodos virtuales por nombres que son palabras clave en el lenguaje.

Exclusividad

Todo

Todos los nombres de un ámbito compatible con CLS deben ser distintos, incluso cuando los nombres sean para dos clases de miembros diferentes, excepto cuando los nombres son idénticos y se resuelven mediante sobrecarga. Por ejemplo, CLS no permite que un tipo único use el mismo nombre para un método y un campo.

Prototipos

Todo

Todos los tipos devueltos y los tipos de parámetros que aparecen en un prototipo de tipo o miembro deben ser compatibles con CLS.

Tipos

   

   

Tipos primitivos

Todo

La biblioteca de clases de .NET Framework incluye tipos que se corresponden con los tipos de datos primitivos que usan los compiladores. De entre estos tipos, son compatibles con CLS los siguientes: Byte, Int16, Int32, Int64, Single, Double, Boolean, Char, Decimal, IntPtr y String. Para obtener más información sobre estos tipos, vea la tabla de tipos de Información general de la biblioteca de clases de .NET Framework.

Tipos encuadrados

Todo

Los tipos de valor encuadrados (tipos de valor que se han convertido en objetos) no son parte de CLS. Utilice en su lugar System.Object, System.ValueType o System.Enum, según corresponda.

Visibilidad

Todo

Las declaraciones de tipos y miembros no deben contener tipos que sean menos visibles o accesibles que el tipo o miembro que se va a declarar.

Métodos de interfaz

Compiladores

Los compiladores de lenguajes compatibles con CLS deben incluir sintaxis para el caso de que un tipo único implemente dos interfaces y cada una de esas interfaces requiera la definición de un método con el mismo nombre y el mismo prototipo. Tales métodos se deben considerar distintos y no necesitan tener la misma implementación.

Cierre

Todo

Los miembros individuales de interfaces y clases abstractas compatibles con CLS deben definirse para ser compatibles con CLS.

Invocación de constructores

Todo

Para poder tener acceso a datos de instancias heredadas, un constructor debe llamar al constructor de la clase base.

Referencias a tipos

Todo

Las referencias a tipos no son compatibles con CLS. Una referencia a un tipo es una construcción especial que contiene una referencia a un objeto y una referencia a un tipo. Las referencias a tipos permiten que Common Language Runtime proporcione compatibilidad con los estilos de C++ a los métodos que tienen un número variable de argumentos.

Miembros de tipos

   

   

Sobrecarga

Todo

Se permite la sobrecarga de propiedades indizadas, métodos y constructores; no se deben sobrecargar campos y eventos.

Las propiedades no se deben sobrecargar por tipo (es decir, por el tipo de valor devuelto de su método Get), pero se pueden sobrecargar con números o tipos de índices diferentes.

Sólo se permite la sobrecarga de métodos si se basa en el número y en los tipos de parámetros y, en el caso de los métodos genéricos, si se basa en el número de parámetros genéricos.

La sobrecarga de operadores no se incluye en CLS. Sin embargo, CLS proporciona directrices sobre cómo incluir nombres útiles (como Add()) y cómo establecer un bit en los metadatos. Se recomienda que los compiladores que decidan incluir la sobrecarga de operadores sigan estas directrices, aunque no están obligados a ello.

Exclusividad de miembros de sobrecarga

Todo

Los campos y los tipos anidados deben distinguirse únicamente por comparación de identificador. Los métodos, las propiedades y los eventos que tengan el mismo nombre (por comparación de identificador) deben distinguirse por algo más que el tipo de valor devuelto.

Operadores de conversión

Todo

Si op_Implicit u op_Explicit se sobrecarga sobre el tipo de valor devuelto, se debe incluir una forma alternativa para proporcionar la conversión.

Métodos

   

   

Accesibilidad de los métodos reemplazados

Todo

La accesibilidad no se debe cambiar al reemplazar los métodos heredados, excepto cuando se reemplace un método heredado a partir de un ensamblado diferente con accesibilidad FamilyOrAssembly. En este caso, el reemplazo debe tener accesibilidad Family.

Listas de argumentos

Todo

La única convención de llamada admitida por CLS es la convención de llamada administrada estándar; no se permiten las listas de argumentos de longitud variable. (Utilice la palabra clave ParamArray de Microsoft Visual Basic y la palabra clave params de C# para permitir un número variable de argumentos.)

Propiedades

   

   

Metadatos de descriptor de acceso

Compiladores

Los métodos Get y Set que implementan los métodos de una propiedad se marcan con el identificador mdSpecialName en los metadatos.

Modificadores

Todo

La propiedad y sus descriptores de acceso deben ser static, virtual o instance.

Nombres de descriptores de acceso

Todo

Las propiedades deben seguir los patrones de nombres específicos. Para una propiedad denominada Name, el método Get, si se define, se denominará get_Name y el método Set, si se define, se denominará set_Name.

Tipo de valor devuelto y argumentos

Todo

El tipo de la propiedad es el tipo de valor devuelto del método Get y el tipo del último argumento del método Set. Los tipos de los parámetros de la propiedad son los tipos de los parámetros del método Get y los tipos de todos los parámetros del método Set, excepto el último. Todos estos tipos deben ser compatibles con CLS y no pueden ser punteros administrados; no deben pasarse por referencia.

Eventos

   

   

Métodos de evento

Todo

Los métodos para agregar y quitar un evento deben estar ambos presentes o ausentes.

Metadatos de los métodos de evento

Compiladores

Los métodos que implementen un evento deben marcarse con el identificador mdSpecialName en los metadatos.

Accesibilidad del descriptor de acceso

Todo

La accesibilidad de los métodos para agregar, quitar y provocar un evento debe ser idéntica.

Modificadores

Todo

Los métodos para agregar, quitar y provocar un evento deben ser static, virtual o instance.

Nombres de los métodos de evento

Todo

Los eventos deben seguir los patrones de nombres específicos. Para un evento denominado MyEvent, el método Add, si se define, se denominará add_MyEvent, el método Remove, si se define, se denominará remove_MyEvent y el método Raise se denominará raise_MyEvent.

Argumentos

Todo

Los métodos que se utilizan para agregar y quitar un evento deben tomar un parámetro cuyo tipo defina el tipo del evento, y ese tipo debe derivarse de System.Delegate.

Tipos de puntero

   

   

Punteros

Todo

Los tipos de puntero y los tipos de puntero a función no son compatibles con CLS.

Interfaces

   

   

Prototipos de miembros

Todo

Las interfaces compatibles con CLS no deben requerir la definición de métodos no compatibles con CLS para su implementación.

Modificadores de miembros

Todo

Las interfaces compatibles con CLS no pueden definir métodos estáticos ni pueden definir campos. Pueden definir propiedades, eventos y métodos virtuales.

Tipos de referencia

   

   

Invocación de constructores

Todo

Para los tipos de referencia, se llama a los constructores de objetos sólo como parte de la creación de un objeto, y los objetos se inicializan una sola vez.

Tipos de clase

   

   

Herencia

Todo

Las clases compatibles con CLS deben heredarse de clases compatibles con CLS (System.Object es compatible con CLS).

Matrices1

   

   

Tipos de elemento

Todo

Los elementos de matriz deben ser tipos compatibles con CLS.

Dimensiones

Todo

Las matrices deben tener un número fijo de dimensiones, mayores que cero.

Límites

Todo

Todas las dimensiones de una matriz deben tener un límite menor que cero.

Enumeraciones

   

   

Tipo subyacente

Todo

El tipo subyacente de una enumeración debe ser un tipo entero integrado en CLS (Byte, Int16, Int32 o Int64).

FlagsAttribute

Compiladores

La presencia del atributo personalizado System.FlagsAttribute en la definición de una enumeración indica que la enumeración debe tratarse como un conjunto de campos de bits (indicadores), y la ausencia de este atributo indica que el tipo debe verse como un grupo de constantes enumeradas. Se recomienda que en los lenguajes se utilice FlagsAttribute o sintaxis específica del lenguaje para distinguir estos dos tipos de enumeraciones.

Miembros de campo

Todo

Los campos static literales de una enumeración deben ser del mismo tipo que el tipo de la enumeración.

Excepciones

   

   

Herencia

Todo

Los objetos que se produzcan deberán ser de tipo System.Exception o heredarse de System.Exception.

Atributos personalizados

   

   

Codificaciones de valores

Compiladores

Los compiladores compatibles con CLS deben tratar sólo un subconjunto de las codificaciones de los atributos personalizados (la representación de los atributos personalizados en los metadatos). Los únicos tipos que pueden aparecer en estas codificaciones son: System.Type, System.String, System.Char, System.Boolean, System.Byte, System.Int16, System.Int32, System.Int64, System.Single, System.Double y cualquier tipo de enumeración basado en un tipo entero base compatible con CLS.

Metadatos

   

   

Compatibilidad con CLS

Todo

Los tipos que tienen una compatibilidad con CLS distinta a la del ensamblado en el que se definen deberán marcarse correspondientemente mediante System.CLSCompliantAttribute. De manera similar, los miembros cuya compatibilidad con CLS sea diferente de la de su tipo también se deben marcar. Si un miembro o tipo está marcado como no compatible con CLS, debe proporcionarse una alternativa compatible con CLS.

Genéricos

Nombres de tipo

Compiladores

El nombre de un tipo genérico debe codificar el número de parámetros de tipo declarados en el tipo. El nombre de un tipo genérico anidado debe codificar el número de parámetros de tipo recién introducidos en el tipo.

Tipos anidados

Compiladores

Los tipos anidados deben tener, como mínimo, el mismo número de parámetros genéricos que el tipo contenedor. Los parámetros genéricos de un tipo anidado se corresponden por posición con los parámetros genéricos del tipo contenedor.

Restricciones

Todo

Todo tipo genérico deberá declarar restricciones suficientes como para garantizar que cualquier restricción de las interfaces o del tipo base se vea satisfecha por las restricciones del tipo genérico.

Tipos de restricción

Todo

Los tipos que se utilizan como restricciones en parámetros genéricos deberán ser compatibles con CLS.

Prototipos de miembros

Todo

Se entiende que la visibilidad y accesibilidad de los miembros (incluidos los tipos anidados) de un tipo genérico del que se ha creado una instancia quedan restringidas al ámbito específico de creación de instancias, y no a la declaración de tipos genéricos en general.

Métodos genéricos

Todo

Cada método genérico abstracto o virtual deberá tener su propia implementación concreta (no abstracta) predeterminada

1. La matrices escalonadas, es decir, matrices de matrices son compatibles con CLS. En la versión 1.0 de .NET Framework, el compilador de C# informa erróneamente de que no lo son.

Vea también

Conceptos

Información general acerca de la interoperabilidad de lenguajes

Otros recursos

Interoperabilidad entre lenguajes