[解決済み] C#のswitch文の制限 - なぜ?
質問
switch文を書くとき、case文の中で切り替えられるものには2つの制限があるようです。
たとえば (そして、そう、あなたがこの種のことを行っているなら、おそらくあなたの オブジェクト指向 (OO) アーキテクチャが不安定であることを意味します - これは単なる意図的な例です!)。
Type t = typeof(int);
switch (t) {
case typeof(int):
Console.WriteLine("int!");
break;
case typeof(string):
Console.WriteLine("string!");
break;
default:
Console.WriteLine("unknown!");
break;
}
ここでは、switch()文は「A value of an integral type expected」、case文は「A constant value is expected」で失敗しています。
なぜこのような制限があるのでしょうか、またその根本的な正当性は何なのでしょうか。switchステートメントの には が静的解析にのみ負ける理由も、スイッチオンされる値が積分型(つまり原始的)でなければならない理由も見当たりません。正当な理由は何でしょうか?
どのように解決するのですか?
これは私のオリジナルの投稿で、いくつかの議論を巻き起こしました... それは間違っているため :
<ブロッククオートswitch文は、大きなif-else文と同じものではありません。 大きなif-else文と同じものです。 それぞれのケースは一意であり、静的に評価されなければなりません を静的に評価しなければなりません。 switch文は ケース数に関係なく、一定時間の分岐を switch文は、ケース数に関係なく、一定の時間で分岐します。 if-else文は 文は、各条件を評価します。 を評価し、真となる条件を見つけるまで
実は、C#のswitch文は ではなく は常に一定時間のブランチです。
場合によっては、コンパイラはCIL switchステートメントを使用し、それは確かにジャンプテーブルを使用して一定時間の分岐となります。 しかし、次のような疎なケースでは Ivan Hamilton が指摘するように、コンパイラはまったく別のものを生成することがあります。
これは実際には、さまざまな C# switch ステートメントを、あるものは疎に、あるものは密に書いて、結果の CIL を ildasm.exe ツールで見ることで非常に簡単に確認できます。
関連
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] Pythonのswitch文の代用品?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] EqualsメソッドがオーバーライドされたときにGetHashCodeをオーバーライドすることが重要な理由は何ですか?
-
[解決済み] switch文の中で変数を宣言してはいけないのはなぜですか?
-
[解決済み] Stringでswitch文が使えないのはなぜですか?
-
[解決済み] JavaScriptで複数ケースを扱うSwitch文
-
[解決済み] switch文の複数ケース
-
[解決済み] C#のSwitch文のフォールスルー?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] 1つ以上のエンティティで検証に失敗しました。詳細は'EntityValidationErrors'プロパティを参照してください [重複]。
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】URLから画像をダウンロードする方法
-
[解決済み】IntPtrとは一体何なのか?
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?