1. ホーム
  2. c#

[解決済み] C#のswitch文の制限 - なぜ?

2022-05-30 18:01:59

質問

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 ツールで見ることで非常に簡単に確認できます。