深い洞察を感謝します。
がんばります。
他の回答が指摘しているように、ここで起こっているのは、式がステートメントとして使用されていることをコンパイラが検出していることです。C、JavaScript、その他多くの言語では、式をステートメントとして使用することは完全に合法です。 2 + 2;
これは効果のないステートメントですが、これらの言語では合法です。一部の式は値にのみ有効であり、一部の式は副作用(voidを返すメソッドの呼び出しなど)にのみ有効であり、一部の式は残念ながら両方に役立ちます。(増分のように。)
要点:式のみで構成されるステートメントは、それらの式が通常、値よりも副作用に役立つと考えられていない限り、ほぼ間違いなくエラーです。C#の設計者は、一般に副作用と考えられている式を許可する一方で、通常はその値に役立つと考えられている式を許可しないことで、中間点を見つけたいと考えました。C#1.0で識別された一連の式は、インクリメント、デクリメント、メソッド呼び出し、割り当て、そして議論の余地があるが、コンストラクターの呼び出しでした。
ASIDE:通常、オブジェクトの構造は、その構造の副作用ではなく、生成する値に使用されると考えられます。私の意見でnew Foo();
は、許可することは少し誤動作です。特に、セキュリティの欠陥を引き起こしたこのパターンを実際のコードで確認しました。
catch(FooException ex) { new BarException(ex); }
コードが複雑な場合、この欠陥を見つけるのは驚くほど難しい場合があります。
したがって、コンパイラーは、そのリストにない式で構成されるすべてのステートメントを検出するように機能します。特に、括弧で囲まれた式は、括弧で囲まれた式として識別されます。これらは「ステートメント式として許可」のリストにないため、許可されません。
これらはすべて、C#言語の設計原則に基づいています。入力した(x++);
場合、おそらく何か間違ったことをしていたでしょう。これは、おそらくタイプミスM(x++);
か、それとも単なる誤りです。覚えておいてください、C#コンパイラチームの態度ではない「私たちは、この作品を作るためにいくつかの方法を考え出すことができますか?」C#コンパイラチームの姿勢「である可能性が間違いのようなもっともらしいコードに見える場合は、聞かせてのは、開発者に通知します」。C#開発者はその態度を好みます。
とはいえ、実際には、C#の仕様で括弧が許可されていないことを暗示または明示している奇妙なケースが実際にはいくつかありますが、C#コンパイラでは括弧を許可しています。これらのほとんどすべての場合、指定された動作と許可された動作のわずかな不一致は完全に無害であるため、コンパイラの作成者はこれらの小さなバグを修正していません。あなたはそれらについてここで読むことができます:
return myVarとreturn(myVar)に違いはありますか?