Switch-Case不能这样工作吗?

时间:2012-03-06 16:02:10

标签: c# compiler-errors

我正在尝试将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";
        }

有解决方法吗?

注意:我真的必须使用switch-case(而不是if-elses)

6 个答案:

答案 0 :(得分:13)

您无法执行此操作:switch语句只能使用单个值,而不能使用case的范围。

您需要使用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语句如何工作的例子

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;
 ...
}

但是,如果我在代码库中看到这一点,我会感到困惑和生气。

答案 1 :(得分:3)

答案虽然不是你想要的,但你必须在case表达式中使用编译时常量。如果表达式在运行时有所不同,那么必须使用if..else代替。

此外,case值是隐式逻辑相等比较,无法使用<>

答案 2 :(得分:0)

不,这不是switch / case的工作方式。 if / else if是正确的做法。

您可以如下所示堆叠case,但是当您拥有这么多case时,这不是正确的事情。

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";  
 }

答案 3 :(得分:0)

如果不使用if-else,这(大多数情况下)是不可能的。如果你必须使用一个开关,那么这是我所知道的唯一方法(让案件相互下降):

switch (numero)
{
    case 0:
    case 1:
    case 2:
    ...
    case 15:
        //Do Stuff
        break;
    case 16:
    ...
    //Continue as above for each range
}

答案 4 :(得分:0)

不幸的是,switch语句中没有范围支持,你可以使用if else语句,也可以这样做:

  case 15:
  case 16:
  case 16:
  case 18: 
// do something

答案 5 :(得分:0)

是的,你完全正确。 C#中的switch语句不会像那样工作。

在C#中实现此类逻辑的正确方法是使用if,else if,else块。 (是的,我看过你的笔记,但不确定为什么你必须使用开关)。

出于各种设计原因,不建议使用switch语句和if else链,因为根据它们的定义,它们具有X行为或责任。更好的方法是尝试使用polymorphism的解决方案。您应该将这些行为重构为单独的不同类,每个类处理其中一个案例。