switch
Switch ステートメントのフォールスルーは、私がvs.構文を愛する主な理由の 1 つです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:') から別のケース ラベルにフォールスルーできません。
if
なぜですか? また、3 つのsを使用せずにこの種の動作を実現する方法はあるのでしょうか?
ベストアンサー1
(コピー/貼り付け私が他の場所で提供した回答)
フォールスルー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;
}