Оператор переключения fallthrough является одной из моих персональных основных причин любви switch
по сравнению с. 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[]
s должен быть объявлен вне функции: хорошо, они, это - просто пример.
Компилятор перестал работать со следующей ошибкой:
Control cannot fall through from one case label ('case 3:') to another Control cannot fall through from one case label ('case 2:') to another
Почему? И есть ли любой способ получить этот вид поведения, не имея три if
s?
После каждого оператора требуйте break или goto, даже если это случай по умолчанию.
Вы можете добиться провала, как в C ++, с помощью ключевого слова goto.
Пример:
switch(num)
{
case 1:
goto case 3;
case 2:
goto case 3;
case 3:
//do something
break;
case 4:
//do something else
break;
case default:
break;
}