[解決済み] なぜ、(j++);という記述が禁じられたのですか?
質問
以下のコードは間違っています(参照 アイデア次第で ):
public class Test
{
public static void Main()
{
int j = 5;
(j++); // if we remove the "(" and ")" then this compiles fine.
}
}
エラー CS0201: 代入、呼び出し、インクリメント、デクリメント、await、および 新規オブジェクト式は、ステートメントとして使用することができます。
- なぜ括弧を取り除くとコードがコンパイルされるのですか?
- なぜ、括弧があるとコンパイルできないのですか?
- なぜC#はそのように設計されたのですか?
どうすれば解決するの?
<ブロッククオート深い洞察に感謝します。
がんばります。
他の回答者が指摘しているように、ここで起こっていることは、コンパイラが
式
として使用されています。
ステートメント
. CやJavaScriptなど多くの言語では、式を文として使うことは完全に合法です。
2 + 2;
はこれらの言語では合法であり、これは何の効果もない文である。いくつかの式はその値に対してのみ有効であり、いくつかの式はその副作用(例えばvoid returnメソッドの呼び出し)に対してのみ有効であり、残念ながらいくつかの式は両方に対して有効です。(インクリメントのような)
ポイント:式だけで構成された文はほぼ間違いなくエラーになる ただし、それらの式が値よりもその副作用のために有用であると一般的に考えられている場合は除きます。 . C#の設計者は、一般的に副作用があると考えられている式を許可する一方で、一般的にその値が有用であると考えられている式を禁止することで、その中間を見つけようとしました。 C#1.0では、インクリメント、デクリメント、メソッドコール、アサインメント、そして少し物議を醸したコンストラクタの起動がその対象となりました。
ASIDE 通常、オブジェクトの構築は、構築の副作用ではなく、それが生み出す価値のために使用されると考えるのが普通だと思います。
new Foo();
は、ちょっとしたミスフィーチャーです。特に、実際のコードでこのパターンを見て、セキュリティ上の欠陥が発生したことがあります。
catch(FooException ex) { new BarException(ex); }
コードが複雑な場合、この不具合を発見するのは意外と難しいかもしれません。
そのため、コンパイラはこのリストにない式で構成されるすべてのステートメントを検出するように動作します。特に、括弧でくくられた式は、そのまま括弧でくくられた式として認識されます。 これらは、quot;ステートメント式として許可される" のリストにないので、許可されません。
これらはすべて、C#言語の設計原則のためにある。
もし、あなたが
(x++);
おそらく、何か間違ったことをしているのでしょう。
. のタイプミスであろう。
M(x++);
とか、そういうことです。C#コンパイラーチームの姿勢は、"ではないことを覚えておいてください。
どうにかして、これを動かす方法はないだろうか?
C#コンパイラーチームの姿勢は、「"
もっともらしいコードが間違いの可能性が高そうなら、開発者に知らせよう。
ということです。 C#の開発者はそのような姿勢が好きなのです。
さて、そうは言っても、実はC#の仕様で奇妙なケースがいくつかあります。 する C#コンパイラは、括弧を使用しないことを暗示または明示しているにもかかわらず、括弧を許可します。ほとんどすべての場合において、指定された動作と許可された動作の間のわずかな不一致はまったく無害なので、コンパイラの作者はこれらの小さなバグを修正したことがありません。これらのバグについては、ここで読むことができます。
関連
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] C#の正しいバージョン番号を教えてください。
-
[解決済み] なぜ ++[[]][+[] +[+[]] は "10" という文字列を返すのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み】IntPtrとは一体何なのか?