È la nuova funzionalità di C # 4.0 - "Parametri opzionali" conforme a CLS?
-
12-11-2019 - |
Domanda
Questa nuova funzionalità è davvero conveniente.
Ultimamente Leggi il documento del "Microsoft All-in-Ons Code Framework" e menziona che "parametri opzionali" non è conforme a CLS
Così l'ho testato utilizzando "Parametri opzionali" in un'API pubblica e attivato FXCOP, quindi ho compilato e FXCOP non si lamentò di nulla.Alla media mentre, FXCOP ha segnalato un avviso quando aggiungo un'API che ha Uint come il suo tipo di ritorno.
Allora ora sono confuso, è "parametri facoltativi" conforme a CLS o no?
E qual è il modo migliore per scoprire se una nuova funzionalità della lingua è conforme a CLS o no?
Soluzione
Argomenti opzionali sono "Sort-of" conforme a CLS. I metodi con argomenti opzionali sono legali e possono essere compilati con successo con l'attributo generacodictagcode, ma i chiamanti di tali metodi non devono necessariamente tenere conto dei valori dei parametri predefiniti o dell'attributo opzionale. (Nel qual caso tali metodi si comportano esattamente nello stesso modo dei metodi standard, che richiedono che tutti gli argomenti siano indicati esplicitamente nel sito di chiamata.)
.Metodi che utilizzano parametri predefiniti sono ammessi sotto il linguaggio comune Specifiche (CL); Tuttavia, il CLS consente ai compilatori di ignorare i valori che sono assegnati a questi parametri. Codice che è scritto per i compilatori che ignora i valori dei parametri predefiniti deve esplicitamente fornire argomenti per ogni parametro predefinito. Mantenere il comportamento che vuoi Lingue di programmazione, metodi che utilizzare i parametri predefiniti dovrebbero essere sostituito con il metodo sovraccarichi che Fornire i parametri predefiniti.
(preso dalla documentazione per "ca1026: i parametri predefiniti non devono essere utilizzati" . )
Altri suggerimenti
Interpreto la tua domanda per essere di Argomenti opzionali .
Se è così, credo che siano conformi a CLS e puoi controllare utilizzando il Attributo 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());
}
}
}
.
Compila senza avvertimenti.
Dai un'occhiata al specifiche CLS .
.
Da pagina 41:
.Il vincolo VARG può essere incluso per indicare che tutti gli argomenti oltre questo punto sono opzionali.quando Sembra che la Convenzione chiamante deve essere quella che supporta elenchi di argomenti variabili.
Ma la scatola proprio qui sotto dice:
.Regola CLS 15: il vincolo VARG non fa parte del CLS e l'unica convenzione di chiamata supportata dal CLS è la convenzione telefonica gestita standard