2012-05-11 12 views
101

Non è var una parola chiave in C#? Ma perché posso fare questo:Perché posso creare una classe denominata "var"?

public class var { } 

public class main 
{ 
    public static void main(string[] args) 
    { 
     var testVar = new var(); 
    } 
} 

Il var che viene utilizzato nel codice è la classe var che viene dichiarata prima della classe main. E il compilatore non si lamenta nemmeno.

Mentre quando faccio questo:

public class int { } 

o questo:

public class true { } 

Il compilatore ha detto che int o true è una parola chiave e non può essere utilizzato in questo modo. Perché non è lo stesso con var?

+6

Perché si vuole? Così confuso e difficile da leggere. – duffymo

+0

e la parola chiave 'dinamica'? Può anche essere usato? –

+6

Leggi questo: http://blogs.msdn.com/b/ericlippert/archive/2009/05/11/reserved-and-contextual-keywords.aspx – AakashM

risposta

101

var non è una parola chiave according to this list.

è una parola chiave contestuale, quindi dal contesto il compilatore è in grado di decidere quale è la classe e quale è la parola chiave contestuale e non si crea confusione.

una parola chiave contestuale è:

utilizzato per fornire un significato specifico nel codice, ma non è una parola riservata in C#.

così come non è riservato è possibile utilizzarlo.

Come sottolineato nei commenti di cui sopra v'è una discussione delle differenze, nonché un elenco delle varie parole chiave e parole chiave contestuali aggiunto a ogni versione di C# su Eric Lipperts blog

E 'interessante notare che, poiché il la serie di parole chiave è stata decisa in C# 1.0 e non sono state aggiunte aggiunte, in modo da preservare la retrocompatibilità.

+1

Tuttavia è classificato in "C# parole chiave" qui http://msdn.microsoft.com/en-us/library/bb383973.aspx ... confondendo! – Richard

+4

Ma è un [ 'Keyword' contestuale] (http://msdn.microsoft.com/en-us/library/x53a06bb.aspx). _ "Una parola chiave contestuale viene utilizzata per fornire un significato specifico nel codice, ma ** non è una parola riservata in C# **. Alcune parole chiave contestuali, come parziale e in cui, hanno significati speciali in due o più contesti." _ –

+5

@TimSchmelter Quindi "var" è una "parola chiave". Solo non una "parola riservata", giusto? – luiscubal

18

Il compilatore è abbastanza intelligente da sapere che il contesto in cui si utilizza var come nome di classe non è mai un contesto per la parola chiave, quindi lo consente (motivo per cui è definito come contextual keyword).

+0

Penso che questa risposta sia almeno in qualche modo fuorviante. Il compilatore non è esattamente "abbastanza intelligente" per determinare se 'var' viene usato come parola chiave in codice come' var testVar = new var(); '. Sì, il contesto, in termini di definizione di un tipo personalizzato chiamato 'var', ci gioca, ma è proprio perché il compilatore è * non * abbastanza intelligente in questi casi per sapere se' var testVar' si riferisce alla classe ' var' o alla parola chiave 'var' che ha come valore predefinito la classe in tale contesto. Se la parola chiave 'var' fosse diversa, potrebbe essere utilizzata nello stesso" contesto ". –

+0

Contrasto che con altre parole chiave contestuali, come 'add' - qui, il compilatore sa infatti ad ogni occorrenza se la parola chiave è intesa (dichiarazione di evento, l'identificatore non avrebbe alcun senso lì), o se il codice si riferisce ad un identificatore (tipo o nome in una dichiarazione, uso dell'identificatore all'interno di un corpo del metodo, parola chiave non avrebbe alcun senso lì). –

8

Nelle versioni C# prima della versione 3, implicitly typed local variables non erano ancora supportati, quindi var non aveva alcun significato speciale ed era possibile definire variabili e classi denominate var. Il tuo programma di esempio è legale, poiché entrambe le occorrenze diin main si riferivano alla classe var.

C# 3 e versioni successive sono compatibili verso il basso, quindi il codice scritto in C# prima della versione 3 viene ancora compilato con i nuovi compilatori.

int e true sono le parole chiave da C# 1.

12

Un altro modo di guardare a questo: "var" come parola chiave non era nelle prime versioni di C# (a differenza di "int" e "vero"), in modo da potresti aver scritto del codice che aveva una classe chiamata "var". Questo era perfettamente valido e legale. Successivamente, quando "var" è stato aggiunto al linguaggio, i progettisti sono stati così gentili da renderlo una parola chiave solo in determinati contesti, quindi la classe var esistente funzionerebbe ancora.

Questa è una delle vere sfide della progettazione il linguaggio - come aggiungere nuove funzioni senza rompere il codice esistente, e senza fare le nuove funzionalità complesse da usare.

3

parole chiave possono essere prenotati contestualmente. Quando viene analizzato il codice sorgente, tale contesto viene stabilito come parte dell'albero di analisi. La valutazione delle parole chiave avviene all'interno di quel contesto. Quindi, in questo caso, var non si trova in un contesto riservato e non avrà lo stesso significato di quando lo si utilizza in un'istruzione di assegnazione. Credo che una ragione di questa flessibilità è che var è stato introdotto in C# 3, quindi renderlo riservato ovunque potrebbe avere una compatibilità con le versioni precedenti in alcuni programmi, mentre usarlo come una dichiarazione di tipo variabile non sarebbe stato compilato nelle versioni precedenti, quindi non c'è rottura.

Problemi correlati