Des aperçus profonds appréciés.
Je ferai de mon mieux.
Comme d'autres réponses l'ont noté, ce qui se passe ici, c'est que le compilateur détecte qu'une expression est utilisée comme instruction . Dans de nombreux langages - C, JavaScript et bien d'autres - il est parfaitement légal d'utiliser une expression comme une déclaration. 2 + 2;
est légal dans ces langues, même s'il s'agit d'une déclaration sans effet. Certaines expressions ne sont utiles que pour leurs valeurs, certaines expressions ne sont utiles que pour leurs effets secondaires (comme un appel à une méthode de retour void) et certaines expressions, malheureusement, sont utiles pour les deux. (Comme incrément.)
Le fait est que les déclarations qui consistent uniquement en expressions sont presque certainement des erreurs à moins que ces expressions ne soient généralement considérées comme plus utiles pour leurs effets secondaires que leurs valeurs . Les concepteurs C # souhaitaient trouver un terrain d'entente, en autorisant les expressions généralement considérées comme ayant un effet secondaire, tout en refusant celles qui sont également généralement considérées comme utiles pour leurs valeurs. L'ensemble d'expressions qu'ils ont identifié dans C # 1.0 étaient des incréments, des décrémentations, des appels de méthode, des affectations et, de manière quelque peu controversée, des invocations de constructeur.
A part: On pense normalement qu'une construction d'objet est utilisée pour la valeur qu'elle produit, pas pour l'effet secondaire de la construction; à mon avis, permettre new Foo();
est un peu une erreur. En particulier, j'ai vu ce modèle dans le code du monde réel qui a causé un défaut de sécurité:
catch(FooException ex) { new BarException(ex); }
Il peut être étonnamment difficile de repérer ce défaut si le code est compliqué.
Le compilateur fonctionne donc pour détecter toutes les instructions qui consistent en des expressions qui ne figurent pas sur cette liste. En particulier, les expressions entre parenthèses sont identifiées comme cela - des expressions entre parenthèses. Ils ne figurent pas dans la liste des «expressions autorisées en tant qu'expressions d'instruction», donc elles sont interdites.
Tout cela est au service d'un principe de conception du langage C #. Si vous avez tapé, (x++);
vous avez probablement fait quelque chose de mal . C'est probablement une faute de frappe M(x++);
ou quelque chose de juste. N'oubliez pas que l'attitude de l'équipe du compilateur C # n'est pas " pouvons-nous trouver un moyen de faire ce travail? " L'attitude de l'équipe du compilateur C # est " si le code plausible ressemble à une erreur probable, informons le développeur ". Les développeurs C # aiment cette attitude.
Maintenant, tout ce que dit, il y a effectivement quelques cas bizarres où la spécification C # n'Évoquez ou énoncez pur et simple que les parenthèses ne sont pas autorisés , mais le compilateur C # leur permet de toute façon. Dans presque tous ces cas, la différence mineure entre le comportement spécifié et le comportement autorisé est totalement inoffensive, de sorte que les auteurs du compilateur n'ont jamais corrigé ces petits bogues. Vous pouvez en savoir plus ici:
Y a-t-il une différence entre return myVar et return (myVar)?