开关盒don';不要这样工作

本文关键字:工作 don 开关 | 更新日期: 2023-09-27 18:26:49

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

这方面有什么办法吗?

注意:我真的必须使用开关情况(而不是如果elses)

开关盒don';不要这样工作

不能这样做: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;
 ...
}

然而,如果我在我的代码库中看到这一点,我会感到困惑和愤怒。

答案虽然不是您想要的,但必须在case表达式中使用编译时常数。如果表达式在运行时会发生变化,则必须改用if..else

此外,case值是一个隐含的逻辑相等比较,不能使用<>

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

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

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

  case 15:
  case 16:
  case 16:
  case 18: 
// do something
不,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";  
 }

是的,你完全正确。C#中的Switch语句不能这样工作。

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

由于各种设计原因,不鼓励切换语句,如果其他,则不鼓励链,因为根据其定义,它们具有X行为或责任。更好的方法是尝试使用多态性的解决方案。您应该致力于将这些行为重构为单独的、不同的类,每个类都处理其中一个案例。