9
votes

Pourquoi est-ce que c # snippet légal?

question idiote, mais pourquoi la ligne suivante compile-t-elle? XXX

Comme vous pouvez le constater, je n'ai pas participé au second élément et laissé une virgule là-bas. Compile toujours même si vous vous attendez à ce que ce soit.


6 commentaires

Stackoverflow.com/ Questions / 2311864 / ...


Je suis émerveillé, quiconque serait satisfait de la réponse "car c'est ce que dit la spécification". Les réponses de Steck's et Jimmy expliquent pourquoi il est bénéfique .


J'ai voté parce que j'ai été impressionné par la flèche ....


Oh oui, la flèche est fantastique. Personne ne se plaint de la flèche.


@Arwicker: La question n'est pas "Comment puis-je utiliser cette virgule fuite", mais "pourquoi compile-t-il"? De la question à répondre ...


@Luca - par ce raisonnement, nous pourrions avoir 1000 autres questions sur chaque caractéristique de la langue, demandant "pourquoi cela compile-t-il?", Chacun avec une réponse de votre part disant "parce que la norme dit ceci ..." une telle réponse indique presque rien. La question contient un grand indice: "Compile toujours même si vous vous attendriez à ce que ce soit." En fait, vous devriez vous attendre à ce que cela compilait et une langue qui ne compilait pas cela serait plus pauvre. C'est une fonctionnalité, pas un bug. Les bonnes réponses expliquent cela.


6 Réponses :


7
votes

Il devrait compiler par définition.

Il n'y a pas de deuxième élément. Une virgule de fuite est une syntaxe valide lors de la définition d'une collection d'articles.

i est une matrice de int contenant un seul élément, i [0] contenant la valeur 1 .


9 commentaires

Cette virgule supplémentaire me dit qu'une autre valeur est attendue.


C'est peut-être votre interprétation, mais ce n'est pas la façon dont il est défini.


Cela peut être le cas, mais cela n'a toujours aucun sens, quelle que soit la spécification.


Mais c'est toujours la réponse. Cet extrait est légal en raison de la spécification et Jimmy donne le raisonnement derrière cette décision.


@Sir Psycho: Je ne peux m'empêcher que j'ai bien peur, c'est ainsi que les concepteurs de la langue définis.


Allez crier à tous ceux qui ont écrit C, Java et C # pour changer de spécification.


@LUCA: La question était "Pourquoi cette ligne compile-t-elle?": Je suis sûr que j'ai expliqué cela.


@Sir Psycho: Je ne peux pas m'empêcher de notifier que vous avez accepté la réponse qui cite la spécification que vous trouvez si difficile à avaler! MDR


Sir Psycho: Lorsque vous écrivez int i; I ++; Vous ne dites pas que le point-virgule supplémentaire vous dit qu'une autre déclaration est attendue, n'est-ce pas? Alors pourquoi ne pas laisser la virgule supplémentaire aussi?



5
votes

C'est ainsi que vous pouvez le faire et copier / coller des lignes sans vous soucier de la suppression / l'ajout des virgules dans les bons endroits.

int[] i = new[] { 
   someValue(),
   someOtherValue(),
   someOtherOtherValue(),

   // copy-pasted zomg! the commas don't hurt!
   someValue(),
   someOtherValue(),
   someOtherOtherValue(),

};


1 commentaires

11
votes

Je suppose parce que la norme ECMA 334 indique: xxx

Comme vous pouvez le constater, la virgule de fuite est autorisée: xxx


< p> ps Pour une bonne réponse (même si ce fait était déjà pointé par de nombreux utilisateurs). :)

une virgule de fuite pourrait être utilisé pour faciliter la mise en œuvre des générateurs de code automatiques (les générateurs peuvent éviter de tester pour le dernier élément de l'initialiseur, car il devrait être écrit sans la virgule de fuite) et l'initialisation de la matrice conditionnelle avec le préprocesseur Directives.


0 commentaires

10
votes

Ceci est le sucre de syntaxe. En particulier, ce dossier peut être utile dans la génération de code.

int[] i = new int[] {
    1,
    2,
    3,
};


2 commentaires

Gênant que cela est autorisé dans les tableaux, mais pas dans Enums, où ils seraient beaucoup plus utiles.


IMO, cette réponse de Jimmy devrait être éditée ensemble, puis le résultat accepté! Et j'ajouterais l'observation selon laquelle c'est comment ; fonctionne entre des déclarations, pour exactement la même raison. Et qu'en Erlang, où le symbole de fuite est différent (un point au lieu d'une virgule), il peut sembler confortablement semblable à l'anglais au début, mais les utilisateurs finissent par la haïssent pour les mêmes raisons données.



7
votes

Un autre avantage de permettre une virgule de fin est associé aux directives de préprocesseur: xxx

sans permettre une virgule de fuite, qui serait beaucoup plus difficile à écrire. >


0 commentaires

3
votes

Même chose pour ENUMS:

enum Foo
{
  Bar,
  Baz,
};


0 commentaires