3

私は Visual Studio C# コンソールでコース用のテキスト アドベンチャーを書いていますが、goto ケースが非常に便利であるため、一連の if-else の代わりに switch ステートメントを使用することにしました (これまでのところ、非常にうまく機能しています)。スイッチ自体の各ケースは定数でなければならないことは知っていますが、これが goto ケースの使用にも拡張されるかどうか疑問に思っています。たとえば、私は持っています:

switch (location)
{
case 1:
  break;
case 2:
  break;
case 3:
  break;
//I have 10 cases, each representing a location such as "Orc Cave", I just cut it down for brevity
default:
  break;
}

整数変数を入力してからその整数に移動できるようにしたいのですが、それを達成するには次のようにします。

string travel2 = Console.ReadLine();//inputs a integer representing each location
int travel2A = Convert.ToInt32(travel2);
if (1<=travel2A && travel2A<=10)
{
    goto case(travel2A);
}
else{
    goto case(2);//current location
}

すべて正常に動作しますが、ケース (travel2A) に下線を引く「定数値が期待されます」という警告があります。goto case 入力を微調整して変数にすることは可能ですか、それとも switch ステートメントの単なる制限ですか? 後者の場合は、一連の if-else を実行できますが、変数を代入する方が便利だと思います。これに関するヘルプは大歓迎です! ありがとうございました!

4

5 に答える 5

2

この投稿を見る

基本的に、スイッチは case ステートメントで評価されたステートメントを持つことはできません。これらは静的に評価する必要があります。

于 2013-10-10T15:25:25.627 に答える
0

どうですか:

int travel2A = Convert.ToInt32(travel2);
if( travel2A < 1 || travel2A > 10 )
    travel2A = 2;

switch( travel2A ) { ... }
于 2013-10-10T15:31:47.543 に答える
0

コンパイラ エラーA constant value is expectedがすべてを示しています。

これが C# で不可能な理由 (VB のSelect動作は若干異なります) は、デバッグ モードで実行するとよくわかります。ステートメントに遭遇するたびにswitch、コードが選択されたケースにジャンプすることに気付くでしょう。複数の比較をスキップすることでパフォーマンスが大幅に向上しますが、柔軟性が制限されます。

過去にこれを回避した 1 つの方法は、無名メソッドを使用した再帰です。したがって、 を使用する代わりに、ステートメントgoto case(travel2a)を再呼び出しするメソッド呼び出しを使用します。switch

Action<int> foo = null;
foo = (i) =>
{
    switch (i)
    {
        case 1:
            Console.WriteLine("1");
            break;
        case 2:
            Console.WriteLine("1");
            break;
        case 3:
            Console.WriteLine("1");
            break;
        default:
            //goto case (i%3);
            foo(i % 3);
            break;
    }
};

foo(4);
于 2013-10-10T15:37:50.733 に答える