2009-12-18 6 views
17

Volevo utilizzare la parola chiave var per dichiarare un campo nella mia classe, tuttavia var sembra funzionare solo all'interno dei metodi.Utilizzo di var all'esterno di un metodo

Il codice che ho assomiglia:

public static Dictionary<string, string> CommandList = new Dictionary<string, string>{}; 

e ho voluto avere:

public static var CommandList = new Dictionary<string, string> 

Come mai questo non è possibile?

+0

Hai un errore di compilazione? Cosa dice? –

+0

Impossibile risolvere il simbolo var. Sembra che var non sia semplicemente riconosciuto al di fuori dei metodi. –

risposta

30

mio articolo sul tema:

Why no var on fields?

Riassumendo:

  1. Se abbiamo "var" campi poi il tipo di campo non può essere determinato fino a quando l'espressione viene analizzata e ciò accade dopo che abbiamo già bisogno di conoscere il tipo di campo.

  2. Cosa succede se ci sono catene lunghe o cicli in quei riferimenti? Tutti questi algoritmi dovrebbero essere riscritti e testati in un mondo in cui vengono determinate le informazioni di tipo di livello superiore da anziché essere consumate entro il.

  3. Se si dispone di campi "var", l'inizializzatore potrebbe essere di tipo anonimo. Supponiamo che il campo sia pubblico. Non c'è ancora uno standard nel CLR o nel CLS su quale sia il modo giusto per esporre un campo di tipo anonimo.

+3

Questo articolo è roba buona. Molto approfondito sul come e sul perché. –

0

La risposta breve è perché la specifica dice che non è legale. ;-)

Generalmente, questo non è quello che vuoi fare comunque. Il tipo di membro deve essere IDictionary<string, string> non Dictionary<string, string>. È un piccolo errore, ma in genere è meglio usare un'interfaccia in un oggetto visibile esternamente in modo da poter cambiare il tipo in un secondo momento senza influire sui client del codice. Il compilatore ti sta solo dando un piccolo spintone per guidarti in quella direzione.

+5

-1 non ha nulla a che fare con l'utilizzo di un'interfaccia o di un tipo concreto –

+4

-1 d'accordo con Pete. L'errore non ha nulla a che fare con "essere spinto nella giusta direzione" –

+0

Non ho detto che lo ha fatto. Ho detto che era perché le specifiche lo dicevano. A differenza di Eric Lippert, non posso rilasciare dichiarazioni sul perché è stata fatta una scelta perché non ero lì. Tuttavia, credo che anche se non fosse difficile come descritto in seguito, che avrebbero scelto di non farlo per il motivo che ho elencato. È una cattiva idea esporre le informazioni interne del tipo effettivo in una variabile nell'interfaccia di un oggetto. E stavo suggerendo che la domanda stava portando a una decisione sbagliata. Forse troppo sottile. –

6

Dal C# reference

  • A partire dal Visual C# 3.0, le variabili che sono dichiarato al metodo portata possono avere un tipo implicita var.

anche da The C# Programming Reference

  • var può essere utilizzato solo quando una variabile locale è dichiarata e inizializzata nella stessa istruzione; la variabile non può essere inizializzata in null, o in un gruppo di metodi o in una funzione anonima.
  • var non può essere utilizzato sui campi nell'ambito della classe.

Semplicemente non è inteso per l'utilizzo che hai in mente.

L'obiettivo principale è quello di consentire il supporto di tipi anonimi nel codice, con l'ulteriore vantaggio di consentire un modo semplice per specificare le variabili locali.

+1

+1 per quotare la specifica e fornire un riferimento – jcoder