我正在尝试将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)
答案 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的解决方案。您应该将这些行为重构为单独的不同类,每个类处理其中一个案例。