|
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 www.unicode.org/unicode/reports/tr15/tr15-18.html. 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). |
| Matrices 1 | | |
| 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 |