2010-01-23 3 views
6

Ho un parser C# 4.0. Accetta "dinamico" come parola chiave come tipo. I miei viaggi parser oltre le dichiarazioni contenute nel lavoro C# 3.0 programmi della forma di:C# parola chiave 'dinamica' ... è davvero una parola chiave RESERVED o solo un identificatore che significa qualcosa di speciale se usato come tipo?

dynamic = <exp> ; 

Quindi, dinamica realtà una parola chiave? O può ancora essere usato come un nome identificativo arbitrario? (Se sì, perché non viene trattato "int" allo stesso modo)?

C'è una specifica di riferimento da qualche parte che indica se la parola chiave è dinamica? L'ultima specifica dell'ECMA C# 4 non menziona nemmeno "dinamica", e il meglio che riesco a trovare sul sito di MS è una "specifica preliminare" che dice che è una parola chiave ma sospetto che sia solo una scrittura sciatta.

+0

Questo potrebbe aiutare. http://blogs.msdn.com/ericlippert/archive/2009/05/11/reserved-and-contextual-keywords.aspx –

+0

@Eric: bello sfondo. Mi era sfuggito il fatto che var fosse una parola chiave contestuale, oops, ho un parser da regolare. –

risposta

10

dynamic è una parola chiave contestuale di C# 4.0. La quarta edizione delle specifiche ECMA C# non si riferisce a C# 4.0. (Si noti la data di pubblicazione del 2006.)

MSDN lo descrive come una parola chiave.

È anche in questo table of contextual keywords. (Scorrere verso il basso.)

+0

Forse. Ma nello stesso documento MSDN c'è una sezione su keywords in cui "dinamico" è assente. –

+0

Il tuo link è rotto. Ma nella pagina a cui ti riferisci, si trova nella seconda tabella di parole chiave contestuali. –

+0

Aha ... è quello che mi mancava! Grazie mille! –

1

È una parola chiave. (vedi modifica sotto) Sono un po 'confuso su cosa intendi per "perché non viene trattato' int 'allo stesso modo?"

Non si può fare questo: int int = 5;

Ma si può fare questo, anche se non è buona pratica: int @int = 5;

Il C# 4.0 spec non parlare dynamic nella sezione 20.1.

EDIT: più informazioni ...

Utilizzando dinamico come un nome di variabile è consentito, quindi non è una parola chiave (ma è una parola chiave contestuale - vedi Sean Devlin's post). Vedere la schermata qui sotto usando .NET 4.0 beta

dynamic

Partenza Chris Burrow di blog post. Una citazione interessante da posta:

Come si può vedere, le visibili pubblicamente i membri che utilizzano il tipo di dinamica in realtà, dietro le quinte, utilizzare l'oggetto tipo quando vengono emessi. Non esiste alcun tipo di struttura "dinamico". Tuttavia, questi "oggetti" sono tutti decorati in modo tale che il compilatore (o chiunque altro) possa dire che devono essere gestiti dinamicamente .

+0

Come lo sai esattamente? ... Stai affermando che il programma C# 3.0 che contiene i compiti dinamici non è valido in C# 4.0 (che rompe la retrocompatibilità che di solito è un no-no)? Se il compito * è * valido in C3.0, allora perché would not = 7; essere permesso? –

+0

Penso che ogni versione principale della lingua abbia aggiunto parole chiave e compatibilità inversa. Per esempio. 'foreach' in C# 2.0 e' var' in C# 3.0. –

+0

... Sì, ho visto che la specifica C# 4.0; questo è quello di cui non mi fido per la sua caratterizzazione della "parola chiave" attuale. La specifica C# 3.0 ha una sezione esplicativa sulle parole chiave; la specifica C# 4.0 non lo è e quindi è difficile dire se questo dettaglio è affrontato in modo accurato. (Sono sicuro che il compilatore C# 4.0 ha un'opinione, ma lo faranno anche codificatori C3.0 arrabbiati che usano dinamici come nome identificativo.) –

7

non è una parola chiave "normale" come if, for ecc

E 'un contestuale parole chiave come yield, from etc.

In particolare, questo compila:

object dynamic = 0; // dynamic is a contextual keyword 

ma questo non lo fa:

object string = 0; // string is a regular keyword 

Avresti per "fuga" string come questo:

object @string = 0; 

Questo ha molto senso in termini di retrocompatibilità: è improbabile che molte persone abbiano creato uno tipo chiamato dynamic (che potrebbe causare ambiguità; IIRC il tipo "reale" vince in questo caso) mentre è molto probabile che il codice esistente usi variabili chiamate dynamic.

In un certo senso non ha nemmeno bisogno di essere una parola chiave contestuale (e non credo che la specifica si riferisca mai esplicitamente ad essa come tale) - si può pensare ad esso come al nome di un tipo che è sempre disponibile (come string e object). Immagino che string siano state create parole chiave dalla v1 per evitare confusione, ma l'aggiunta di parole chiave autentiche (che non possono essere utilizzate come identificatori) avrebbe ora un costo di compatibilità elevato.

+0

Grande (in realtà ti credo perché questo eviterebbe alcuni problemi di compatibilità con le versioni precedenti). Ma ... dov'è la fonte autorevole che stai usando per ottenere questo fatto specifico? –

+0

@Ira: sto osservando una copia della specifica C# 4 che * non * elenca 'dynamic' tra le parole chiave; non esiste un elenco di parole chiave contestuali. Sto modificando per ulteriori informazioni ... –

+0

Ottima spiegazione Jon!Ma sento che usare la parola "Riservata" al posto di "Normale" sarebbe stato più azzeccato in quanto ci sono due tipi di parole chiave definite in C#, cioè riservate e contestuali. – RBT