我写了一些像这样的 if-else 语句:
if (workedDays > 0 && workedDays <= 180)
{
x= 14;
}
if (workedDays > 180 && workedDays <= 540)
{
x= 28;
}
if (workedDays > 540 && workedDays <= 1068)
{
x= 42;
}
else
{
x= 56;
}
我试图将其重写为 switch 语句,如下所示:
switch (workedDays)
{
case (workedDays > 0 && workedDays <= 180):
x=14;
break;
default:
break;
}
但是,我收到错误Cannot implicitly convert type 'bool' to 'int'
。
我该如何解决?
答案 0 :(得分:6)
虽然@Jeroen的switch(true)
答案可能有效,但我建议以下内容以获取可读性:
if (workedDays <= 180)
x = 14;
else if (workedDays <= 540)
x = 28;
else if (workedDays <= 1068)
x = 42;
else
x = 56;
使用else if
构造,无需仔细检查最小值和最大值。
答案 1 :(得分:2)
好吧,我个人不喜欢有这么多if-else-if。
我通常遵循“三个或更多,使用一个!”的想法。
所以,我会这样做: -
class Program
{
struct Data
{
public Data (int l, int u, int v)
{
lower = l;
upper = u;
value = v;
}
public int lower;
public int upper;
public int value;
}
static void Main (string [] args)
{
Data []
// at the moment, this is coded into the source
// it can be read from a file at run time instead
data = { new Data (0, 180, 14), new Data (180, 540, 28), new Data (540, 1068, 42) };
int
// again, the default case is hard coded, it too can be loaded from a file
x = 56,
workedDays = 100;
foreach (Data item in data)
{
if (workedDays > item.lower && workedDays <= item.upper)
{
x = item.value;
break;
}
}
}
}
然后,您可以从文件中填写数据数组,以便搜索变为运行时可配置,因此您无需重建程序即可更改范围和结果。
答案 2 :(得分:0)
做的:
switch (true)
{
case (workedDays > 0 && workedDays <= 180):
x=14;
break;
default:
break;
}
答案 3 :(得分:0)
如果你考虑一下你要求编译器做什么,你就会明白为什么你会遇到这个问题。
你正在开启workDays,这可能是一个int:
switch(workedDays:int)
{
case (workedDays > 0 && workedDays <= 180):
break;
}
如果您的案例被评估为真或假结果(bool),那么您要求它在整数之间进行选择,但要给它一个bool作为一种可能性!
答案 4 :(得分:0)
你不能。 Switch语句只能与编译时常量一起使用。 See this question