2014-12-22 4 views
59

Ho visto questo comportamento strano e mi chiedo se ci sia una spiegazione ragionevole per questo:Perché è ;; permesso dopo una dichiarazione di variabile locale, ma non dopo una dichiarazione di campo?

Quando ho messo da parte (per caso) un ulteriore punto e virgola/supplementare nella variabile locale di una funzione come:

public void MyMethod() 
{ 
    int a = 1;; 
    Console.WriteLine(a); //dummy 
} 

E ' compila ma mostra che è ridondante.

enter image description here

Ma quando l'ho fatto con i campi (anche per caso), ho ottenuto un errore (di compilazione):

enter image description here

Domanda

C'è qualche ragione per questa restrizione nei campi?

Nb Conosco già l'altra restrizione per non consentire var con i campi. Ma qui è qualcosa di diverso.

+33

Come si producono queste bellissime patch di dump dello schermo? – DrKoch

+15

C# supporto dichiarazioni vuote così; da solo è valido all'interno di un corpo del metodo, ma non è possibile avere istruzioni nel corpo di una classe; non è valido lì. –

+2

@DrKoch [qui] (http://www.faststone.org/FSCaptureDetail.htm) –

risposta

82

; da solo è una dichiarazione (dichiarazione vuoto), ma solo dichiarazione dichiarazioni sono ammessi nel corpo di una classe; altri tipi di affermazione possono apparire solo nel corpo di un metodo.

+1

quindi la dichiarazione non è una dichiarazione? tutto ciò che finisce con ';' è una dichiarazione. –

+10

@ La dichiarazione di Selman22 è una dichiarazione. una dichiarazione vuota di per sé non è una dichiarazione. –

+0

@YuvalItzchakov questa risposta dice che _statements non sono ammesse nel corpo di una classe._ e se la dichiarazione è una dichiarazione, questo è chiaramente sbagliato. –

3

Nel primo caso il compilatore vede un'istruzione non operativa. Non importa che il secondo ; arrivi dopo una dichiarazione di variabile.

Nel secondo caso il compilatore vede un tentativo di creare una dichiarazione vuota che non è consentita.

6

Non fa parte della dichiarazione delle variabili locali, è una dichiarazione di per sé, come indicato da Thomas.

Questo è valido:

public void MyMethod() 
{ 
    ;;; 
    int a = 1; 


    ; 
    Console.WriteLine(a); //dummy 
    ;; 
} 

L'idea di dichiarazione e virgola è quello di permettere tali costrutti:

while(mycondition) ; 

Non ha senso per permettergli in nel corpo della classe, non porta alcun valore in più.

TLDR; questo non ha nulla a che fare con dichiarazione di variabile/campo

Si potrebbe voler dare un'occhiata a questa discussione anche: When do you use scope without a statement in C#?

'un po' simile, ma non completamente, vi aiuterà a capire perché

int a = 1;;;

è valido.

26

; è un'istruzione vuota. E nell'ambito della classe sono permesse solo le dichiarazioni di dichiarazione.Il corpo della classe è definita in C# Specification 5.0, §10.1.6 Class Body

class-body: 
{ class-member-declarations } 

Ad esempio non è possibile inizializzare un campo in una dichiarazione separata:

class Foo 
{ 
    int x = 2; // this is allowed 
    x = 5; // this is not 
} 

Così si può solo dichiarare campi e gli altri membri, ma non è possibile utilizzare altre dichiarazioni in un corpo di classe.

+0

Stavo per commentare la risposta accettata chiedendo la fonte (grammatica). Grazie, +1! –

-4

All'interno del corpo di una funzione il ridondante; è un'istruzione vuota ma nella dichiarazione di classe è un campo non dichiarato e non è consentito.

+2

Perché dovresti pubblicare una nuova risposta a una domanda a cui è già stata data risposta, specialmente quando la risposta è sbagliata e meno informativa rispetto alle altre? – siride