Switch-Case так не работает? - PullRequest
0 голосов
/ 06 марта 2012

Я пытаюсь преобразовать JavaScript-переключатель в C #.

Я получаю ошибку Error 3 Cannot implicitly convert type 'bool' to 'int'

        switch (numero)
        {
            case (numero > -1 && numero < 16):
                rtn = list1[numero] + " " + str2;
                if (primerDigito != 1)
                {
                    rtn += "s";
                }
                break;
            case (numero > 15 && numero < 30):
                if (numero != 20)
                {
                    rtn = list2[primerDigito] + list1[segundoDigito];
                }
                else
                {
                    rtn = "veinte";
                }
                rtn += " " + str2 + "s";
                break;
            case (numero > 29 && numero < 100):
                rtn = list2[primerDigito] + "nta";
                if (segundoDigito != 0)
                {
                    rtn += " y " + list1[segundoDigito];
                }
                rtn += " " + str2 + "s";
                break;
            case 100:
                rtn = "cien " + str2 + "s";
                break;
            default:
                rtn = "número invalido";
        }

Есть ли способ обойти это?

Примечание: Я действительно ДОЛЖЕН использовать переключатель (а не if-elses)

Ответы [ 6 ]

13 голосов
/ 06 марта 2012

Вы не можете сделать это: оператор switch может использовать только отдельные значения, а не диапазоны для case s.

Вместо этого вам нужно дерево if / else.Что-то в форме:

if(numero > -1 && numero < 16) {
 rtn = list1[numero] + " " + str2;
 if (primerDigito != 1)
 {
  rtn += "s";
 }
} else if(numero > 15 && numero < 30) {
 // logic in second block
} else if...

Обратите внимание, что если вы абсолютно, полностью привержены использованию switch, вам придется перечислить все случаи (но этоэто такой вопиющий грех против разработки программного обеспечения, что я даже не могу поверить, что пишу это - не делайте этого, это просто пример того, как работают операторы переключения ):

switch(numero)
{
 case 0:
 case 1:
 case 2:
 case 3:
 case 4:
 case 5:
 case 6:
 case 7:
 case 8:
 case 9:
 case 10:
 case 11:
 case 12:
 case 13:
 case 14:
 case 15:
  rtn = list1[numero] + " " + str2;
  if (primerDigito != 1)
  {
   rtn += "s";
  }
  break;
 case 16:
 ...
 case 28:
 case 29:
  // second logic block
  break;
 ...
}

Если бы я увидел это в своей кодовой базе, я был бы озадачен и рассержен.

3 голосов
/ 06 марта 2012

Ответ, хотя и не тот, который вам нужен, заключается в том, что вы должны использовать константы времени компиляции в выражениях case. Если выражение будет меняться во время выполнения, тогда вы должны использовать вместо if..else.

Кроме того, значение case является неявным сравнением логического равенства и не может использовать < или >.

0 голосов
/ 06 марта 2012

Да, вы совершенно правы. Операторы переключения в C # не работают так.

Правильный способ реализации такой логики в C # - использовать блок if, else if, else. (Да, я видел вашу заметку, но не уверен, почему вы должны использовать переключатель).

По разным причинам проектирования поменяйте операторы, и если цепочки не поощряются, потому что по определению они имеют X поведения или обязанности. Лучшим подходом является попытка найти решение, которое использует полиморфизм . Вы должны стремиться реорганизовать эти поведения в отдельные классы, каждый из которых обрабатывает один из случаев.

0 голосов
/ 06 марта 2012

К сожалению, в операторах switch нет поддержки диапазонов, вы можете использовать операторы else или сделать это:

  case 15:
  case 16:
  case 16:
  case 18: 
// do something
0 голосов
/ 06 марта 2012

Это (в основном) невозможно без использования if-else. Если вы ДОЛЖНЫ использовать переключатель, то это единственный известный мне способ (позволяющий случаям сваливаться друг на друга):

switch (numero)
{
    case 0:
    case 1:
    case 2:
    ...
    case 15:
        //Do Stuff
        break;
    case 16:
    ...
    //Continue as above for each range
}
0 голосов
/ 06 марта 2012

Нет, это не так, как switch / case работает.if / else if - это то, что нужно сделать.

Вы можете сложить case s, как показано ниже, но если у вас столько case s, это НЕ правильная вещь.

switch(numero)
{
    case 0:
    case 1:
    case 2:
                and so on
    case 15:
        code here
        break;
    case 16:
    case 17:
                and so on
    case 29:
        code here
        break;
                and so on
    case 100:
        rtn = "cien " + str2 + "s"; 
        break;  
    default:      
        rtn = "número invalido";  
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...