2011-01-05 16 views
6

Il motivo per cui lo chiedo è, è valido solo nella dichiarazione dei parametri del metodo, non è vero? Stavo cercando di creare una variabile all'interno del corpo della funzione chiamata "params", ma ovviamente questo non è un grosso problema, mi chiedo solo perché la MS ha scelto di renderla una parola chiave globale e non contestuale.Perché la parola chiave params non è contestuale?

+3

Non sono sicuro sulla parte perché, ma se si desidera veramente utilizzare questo come nome di variabile in C#, premete il nome della variabile con @: int @params = 1; – Derrick

risposta

5

La risposta di tvanoffson congettura che sarebbe difficile rendere "params" contestuale. In realtà non sarebbe così difficile. Considerate:

void M(params x) 

Cosa avremmo fatto in questo caso, per ipotesi, è il primo tentativo di trovare un tipo di 'params. Se potessimo trovarne uno, ottimo, abbiamo finito. Se non potessimo, allora abbiamo un po 'di problemi. supponiamo per esempio invece di x era

void M(params Int32) 

Chiaramente è un errore, ma quale errore? Dovremmo assumere che Int32 sia il nome del parametro e dare l'errore "ti manca il tipo"? Dovremmo assumere che Int32 sia il tipo e dare un errore dicendo che il tipo deve essere un tipo di array e che manchi l'identificatore? Dovremmo dare un errore dicendo che non esiste un tipo chiamato "params"? Qual è la cosa giusta da fare qui? Chiaramente potremmo capire qualcosa ma non è ovvio.

Sono i casi di errore che sono complicati con le parole chiave contestuali; far funzionare i casi di successo è in realtà abbastanza semplice.

Ma in realtà, non è così tanto che è difficile rendere contestuale come quello che lo rende contestuale non è una grande vittoria. Fare contestuali "set" e "value" è stata una grande vittoria, perché abbiamo assunto che tutti i tipi di persone avrebbero intenzione di creare variabili locali con nomi come "set" e "value". "params" non è nemmeno una parola inglese, quindi sembra meno probabile che qualcuno voglia usarlo. Non c'è alcun grande vantaggio nel renderlo contestuale, quindi il costo della funzionalità non è giustificato.

+0

Grazie Eric. Speravo davvero di leggere quello che avevi in ​​mente. Per me sembra che i casi validi siano 1. C'è un tipo params disponibile? 2. In caso contrario, deve esserci un tipo sotto forma di Tipo [] e seguito da un identificativo. Non sono un esperto come te, ma pensi che questo copra tutti i casi? Inoltre hai ragione, non è una parola inglese, ho pensato che sarebbe utile in qualche codice, invece di scrivere parametri/(s). –

2

La parola chiave params sembra essere utile solo nella dichiarazione dei parametri del metodo, ma in realtà sono d'accordo con MS sul fatto che non sarebbe una buona idea lasciare che le parole chiave vengano utilizzate per i nomi di istanze, comunque.

forse stanno riservando la possibilità di avere qualcosa di simile in C# 8.0:

params Customers = DB.GetCustomerList(); 

o comunque permettono params in un ambito locale.

+0

Ma che cosa farebbe? Per me usarlo in ambito locale che hai mostrato non avrebbe molto senso, vero? Non sono sicuro. Btw quando uscirà C# 8.0? : O –

+1

penso intorno al 2017 se la mia sfera di cristallo è accurata. –

+1

Joan - Buona domanda. Non ho idea di cosa potrebbe fare. In realtà, non penso nemmeno che la riga di codice verrà compilata in C# 8.0 a causa di un errore di sintassi. – Flipster

9

Lo stesso potrebbe essere chiesto su qualsiasi altra parola chiave. Ad esempio, perché il contesto non è di "classe" poiché viene utilizzato solo nelle dichiarazioni di classe?

Per me una parola chiave è una parola chiave. Immagino che semplifica enormemente l'analisi lessicale parte della compilazione per non dover essere tale consapevole del contesto.

Per inciso, è possibile utilizzare il simbolo @ per consentire di dichiarare una variabile chiamata 'params' (o qualsiasi altra parola chiave riservata):

var @params = new int[] { 1, 2 }; 
+0

Grazie, ma se la classe era contestuale, come avrebbero separato l'utilizzo di classi annidate? Ma con params, non c'è proprio nessun altro posto in cui utilizzarlo, e sembra che sia facile distinguerli, ma io non sono un maestro di compilatori come Eric Lippert. –

+0

Penso che si possa provare a rendere contestuale la 'classe' cercando la tipica sintassi della dichiarazione di classe: [modificatore di accessibilità] class [nome classe] {}. Ma non sono abbastanza esperto del compilatore per sapere se questo è effettivamente fattibile. –

+0

Ok questo ha senso. –

4

Eric Lippert ha un post sul blog che copre contextual and reserved keywords e la loro storia. Anche se non spiega esplicitamente perché params è nella lista riservata (è stato dal 1,0), implica che appartiene all'insieme di parole riservate che sarebbe duro per rendere contestuale.

+0

Grazie, ecco a cosa servono le parole riservate? Pensavo volesse dire che è riservato a nuovi potenziali usi in futuro? –

+2

@ Joan - alcuni potrebbero esserlo, ma la maggior parte sono * riservati * come in "riservati solo a questo scopo". – tvanfosson

Problemi correlati