开关盒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)
不能这样做: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行为或责任。更好的方法是尝试使用多态性的解决方案。您应该致力于将这些行为重构为单独的、不同的类,每个类都处理其中一个案例。