在C#中无法在交换机中使用小数范围?

pho*_*bia 18 c# decimal switch-statement

我刚刚开始学习C#而且我已经陷入了一些非常基础的问题.

对于我的第一个"应用程序",我以为我会选择简单的东西,所以我决定使用BMI计算器.

BMI被计算成一个十进制类型,我现在试图在switch语句中使用,但是几乎不能在开关中使用十进制?

这个C#解决方案是什么:

            decimal bmi = calculate_bmi(h, w);

            switch (bmi) {
                case < 18.5: 
                    bmi_description = "underweight.";
                    break;
                case > 25:
                    bmi_description = "overweight";
                case > 30:
                    bmi_description = "very overweight";
                case > 40:
                    bmi_description = "extreme overweight";
                    break;
            }
Run Code Online (Sandbox Code Playgroud)

Dan*_*ner 14

switch语句仅支持整数类型(枚举未列出,但可以与switch语句一起使用,因为它们由整数类型支持)(如Changeling所指出的那样支持字符串 - 请参阅注释以供参考)和使用常量值进行相等比较.因此,您必须使用一些if语句.

if (bmi < 18.5M)
{
    bmi_description = "underweight.";
}
else if (bmi <= 25)
{
    // You missed the 'normal' case in your example.
}
else if (bmi <= 30)
{
    bmi_description = "overweight";
}
else if (bmi <= 40)
{
    bmi_description = "very overweight";
}
else
{
    bmi_description = "extreme overweight";
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你的switch语句有点像是因为你正在从小于大于或大于大的切换,并且使用了直通而没有中断.我认为应该只使用一种类型的比较来使代码更容易理解或重新排序检查并且不使用直通.

if (bmi < 18.5M)
{
    bmi_description = "underweight.";
}
else if (bmi > 40)
{
    bmi_description = "extreme overweight";
}
else if (bmi > 30)
{
    bmi_description = "very overweight";
}
else if (bmi > 25)
{
    bmi_description = "overweight";
}
else
{
    // You missed the 'normal' case in your example.
}
Run Code Online (Sandbox Code Playgroud)


Bri*_*ndy 9

使用C#中的switch语句是不可能的.
原因是因为每个case语句都需要一个常量表达式.

此外,每个值只允许一次,表达式的类型必须与您的类型匹配switch.在你的情况下不是这种情况,因为你想要bool类型case语句,但在你的switch.

考虑使用辅助函数进行重构:

//...
decimal bmi = calculate_bmi(h, w);
string bmi_description = get_description_for_bmi(bmi);
//...

string get_description_for_bmi(decimal bmi)
{
    string desc;
    if(bmi < 18.5m)
      desc = "underweight";
    else if(bmi <= 25)
      desc = "average";//You forgot this one btw
    else if(bmi <= 30)
      desc = "overweight";
    else if(bmi <= 40)
      desc = "very overweight";     
    else
      desc = "extreme overweight";

    return desc;
}
Run Code Online (Sandbox Code Playgroud)

进一步阅读:

不仅允许范围值,还不允许非常量表达式.

这是一个不可能的例子:

bool b = true;
bool y = false;
switch (b)
{
    case true:
        break;
    case y:
        break;
}
Run Code Online (Sandbox Code Playgroud)

但是这是可能的:

bool b = true;
const bool y = false;
switch (b)
{
    case true:
        break;
    case y:
        break;
}
Run Code Online (Sandbox Code Playgroud)