1. ホーム
  2. c#

[解決済み] C#のSwitch文のフォールスルー?

2022-03-24 17:45:46

質問

Switchステートメントのフォールスルーは、個人的に好きな大きな理由の一つです。 switch vs. if/else if の構文があります。ここでは、その例を紹介します。

static string NumberToWords(int number)
{
    string[] numbers = new string[] 
        { "", "one", "two", "three", "four", "five", 
          "six", "seven", "eight", "nine" };
    string[] tens = new string[] 
        { "", "", "twenty", "thirty", "forty", "fifty", 
          "sixty", "seventy", "eighty", "ninety" };
    string[] teens = new string[]
        { "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
          "sixteen", "seventeen", "eighteen", "nineteen" };

    string ans = "";
    switch (number.ToString().Length)
    {
        case 3:
            ans += string.Format("{0} hundred and ", numbers[number / 100]);
        case 2:
            int t = (number / 10) % 10;
            if (t == 1)
            {
                ans += teens[number % 10];
                break;
            }
            else if (t > 1)
                ans += string.Format("{0}-", tens[t]);
        case 1:
            int o = number % 10;
            ans += numbers[o];

            break;
        default:
            throw new ArgumentException("number");
    }
    return ans;
}

が出てくるので、頭のいい人はオロオロしています。 string[] は関数の外側で宣言する必要があります:まあ、これは単なる例ですが。

コンパイラは次のようなエラーで失敗します。

あるケースラベル('case 3:')から別のケースラベルに制御を移行することはできません。
あるケースラベル('case 2:')から別のケースラベルに制御を移すことはできません。

なぜですか?また、このような挙動を、3つの if s?

どのように解決するのですか?

(をコピー&ペーストしてください。 他の場所で提供した回答 )

フォールスルー switch - case の中にコードを入れないことで実現できます。 case (参照 case 0 を使用するか、あるいは特別な goto case (を参照してください)。 case 1 ) または goto default (参照 case 2 ) のフォームを使用します。

switch (/*...*/) {
    case 0: // shares the exact same code as case 1
    case 1:
        // do something
        goto case 2;
    case 2:
        // do something else
        goto default;
    default:
        // do something entirely different
        break;
}