parameter - ¿La nueva característica de C#4.0-“Parámetros opcionales” cumple con CLS?
optional parameter c# int (3)
Echa un vistazo a las especificaciones de CLS .
De la página 41:
La restricción vararg se puede incluir para indicar que todos los argumentos más allá de este punto son opcionales. Cuando aparezca, la convención de llamada será una que admita listas de argumentos variables.
Pero el cuadro justo debajo dice:
Regla 15 de CLS: la restricción vararg no es parte de CLS, y la única convención de llamada admitida por CLS es la convención de llamada administrada estándar
Esta nueva característica es realmente conveniente.
Últimamente leí el documento "Microsoft All-In-One Code Framework", y menciona que "Parámetros opcionales" no cumple con CLS.
Así que lo probé utilizando "Parámetros opcionales" en una API pública y activé FxCop, luego compilé y FxCop no se quejó de nada. Mientras tanto, FxCop informó una advertencia cuando agregué una API que tiene uint como su tipo de retorno.
Así que ahora estoy confundido, ¿Cumple CLS con "Parámetros opcionales" o no?
¿Y cuál es la mejor manera de averiguar si una nueva característica de idioma es compatible con CLS o no?
Interpreto que tu pregunta es sobre argumentos opcionales .
Si es así, creo que son compatibles con CLS y puede verificarlo utilizando el atributo CLSCompliant :
using System;
[assembly: CLSCompliant(true)]
namespace ConsoleApplication1
{
public class Program
{
public static int Test(int val=42)
{
return val;
}
static void Main(string[] args)
{
System.Console.WriteLine(Test());
}
}
}
Esto se compila sin advertencias.
Los argumentos opcionales son "de tipo" compatibles con CLS. Los métodos con argumentos opcionales son legales y se pueden compilar con éxito con el atributo CLSCompliant
, pero los usuarios de esos métodos no necesariamente tienen que tener en cuenta los valores de parámetros predeterminados o el atributo opcional. (En cuyo caso, esos métodos se comportarían exactamente de la misma manera que los métodos estándar, lo que requiere que todos los argumentos se declaren explícitamente en el sitio de la llamada).
Los métodos que utilizan parámetros predeterminados están permitidos en la especificación de lenguaje común (CLS); sin embargo, el CLS permite a los compiladores ignorar los valores asignados a estos parámetros. El código que se escribe para los compiladores que ignoran los valores de los parámetros predeterminados debe proporcionar explícitamente argumentos para cada parámetro predeterminado. Para mantener el comportamiento que desea en los lenguajes de programación, los métodos que usan parámetros predeterminados deben reemplazarse con sobrecargas de métodos que proporcionen los parámetros predeterminados.
(Tomado de la documentación para "CA1026: Los parámetros predeterminados no deben usarse" .)