Initialisation de propriété en ligne et virgule de fin

void Main() { Test t = new Test { A = "a", B = "b", // <-- erroneous trailing comma }; } public class Test { public string A { get; set; } public string B { get; set; } } 

Je trouve assez souvent la faute de frappe ci-dessus dans mon code. Je suis toujours surpris que le compilateur ne semble pas se soucier de ça. Pourquoi ce qui précède n’est-il pas une erreur de syntaxe? Y at-il une utilisation réellement valable pour cela?

Je trouve assez souvent la faute de frappe ci-dessus dans mon code. Je suis toujours surpris que le compilateur ne semble pas se soucier de ça. Pourquoi ce qui précède n’est-il pas une erreur de syntaxe?

Parce que les concepteurs de la grammaire en syntaxe C # étaient suffisamment intelligents pour tirer les leçons d’autres langages de programmation qui ne permettaient pas la virgule flottante, à l’irritation constante des programmeurs dans ces langages.

Par exemple, ECMAScript (JavaScript) était muet sur la question au départ, de sorte que certaines implémentations (SpiderMonkey dans Firefox, JavaScript d’Opera, etc.) les ont autorisées, alors que d’autres (JScript de Microsoft) ne le permettaient pas. Cela a conduit à une série de questions “Pourquoi cela ne fonctionne-t-il pas dans IE” ici et ailleurs? (Heureusement, ECMAScript 5 les autorise explicitement et IE8 les prend enfin en charge dans les initialiseurs d’objects – IE8 traite toujours les initialiseurs de tableaux d’une manière non standard, bien que, pour être juste, la virgule pendante n’ait été clarifiée qu’en ECMAScript 5.)

Vous le trouverez également dans de nombreux autres endroits de la grammaire C #, tels que les énumérations et les initialiseurs de tableaux.

Je pense qu’il est permis de simplifier la génération automatique de code.

Dans ce cas, vous pouvez faire en sorte que votre programme crée un code comme celui-ci.

 ... for( char c = 'A'; c < 'Z'; c++ ) { AddToOutput( c + " = \"+c.ToLower()+"\"," ); } ... 

Et ne vous souciez pas de supprimer la dernière virgule.

Ce n’est pas une erreur parce que c’est pratique. Pour append à l’initialiseur, il suffit d’append une ligne au lieu d’append une virgule à une ligne et de saisir une nouvelle ligne.

C’est en fait assez courant dans l’initialisation de liste / tableau dans d’autres langages (python, ruby, hakell, par exemple).