Переключить оператор падения в C #? - PullRequest
343 голосов
/ 06 октября 2008

Падение оператора Switch - одна из моих главных причин любить конструкции 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 с?

Ответы [ 14 ]

0 голосов
/ 04 июня 2010

После каждого оператора case требуется break или goto оператор, даже если это регистр по умолчанию.

0 голосов
/ 06 октября 2008

Вы забыли добавить «перерыв»; утверждение в случае 3. В случае 2 вы записали его в блок if. Поэтому попробуйте это:

case 3:            
{
    ans += string.Format("{0} hundred and ", numbers[number / 100]);
    break;
}


case 2:            
{
    int t = (number / 10) % 10;            
    if (t == 1)            
    {                
        ans += teens[number % 10];                
    }            
    else if (t > 1)                
    {
        ans += string.Format("{0}-", tens[t]);        
    }
    break;
}

case 1:            
{
    int o = number % 10;            
    ans += numbers[o];            
    break;        
}

default:            
{
    throw new ArgumentException("number");
}
0 голосов
/ 06 октября 2008

C # не поддерживает падение с помощью операторов switch / case. Не знаю почему, но на самом деле нет никакой поддержки. Связь

0 голосов
/ 06 октября 2008

Оператор перехода, такой как разрыв, требуется после каждого блока, включая последний блок, будь то регистр или дефолт заявление. За одним исключением, (в отличие от оператор переключения C ++), C # не поддерживать неявный провал из один ярлык к другому. Тот самый Исключением является случай, если заявление о без кода.

- C # switch () документация

...