Pourquoi est-ce ;; autorisé après une déclaration de variable locale, mais pas après une déclaration de champ?

J’ai vu ce comportement étrange et je me demande s’il y a une explication raisonnable à cela:

Lorsque je mets (par accident) un point-virgule supplémentaire dans la variable locale d’une fonction comme:

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

Il comstack mais cela montre que c’est redondant.

entrer la description de l'image ici

Mais quand je l’ai fait avec des champs (aussi par accident), j’ai eu une erreur (compilation):

entrer la description de l'image ici

Question

Y a-t-il une raison à ce caractère ressortingctif dans les domaines?

Nb je connais déjà l’autre chose ressortingctive pour ne pas autoriser var avec les champs. Mais ici c’est quelque chose de différent.

; seul est une déclaration (instruction vide), mais seules les déclarations sont autorisées dans le corps d’une classe; d’autres types d’énoncés ne peuvent apparaître que dans le corps d’une méthode.

; lui-même est une déclaration vide. Et dans la classe, seules les déclarations sont autorisées. Le corps de la classe est défini dans C# Specification 5.0, §10.1.6 Class Body

 class-body: { class-member-declarations } 

Par exemple, vous ne pouvez pas initialiser un champ dans une instruction distincte:

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

Vous ne pouvez donc déclarer que des champs et d’autres membres, mais vous ne pouvez pas utiliser d’autres instructions dans un corps de classe.

Cela ne fait pas partie de la déclaration de variable locale, c’est une déclaration en soi, comme indiqué par Thomas.

Ceci est valide:

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

L’idée de la déclaration en point-virgule est d’autoriser de telles constructions:

 while(mycondition) ; 

Cela n’a aucun sens de l’autoriser dans le corps de la classe, cela n’apporte aucune valeur supplémentaire.

TLDR; cela n’a rien à voir avec la déclaration variable / champ

Vous pourriez aussi vouloir jeter un coup d’oeil à ce sujet: Quand utilisez-vous scope sans une déclaration en C #?

C’est un peu pareil, mais pas complètement, cela vous aidera à comprendre pourquoi

int a = 1;;;

est valable.

Dans le premier cas, le compilateur voit une déclaration de non-opération. Peu importe que le second ; vient après une déclaration de variable.

Dans le second cas, le compilateur voit une tentative de création d’une déclaration vide qui n’est pas autorisée.

Dans le corps d’une fonction, le redondant; est une instruction vide mais dans la déclaration de classe est un champ non déclaré et il n’est pas autorisé.