具有布尔值的开关案例的奇怪行为

时间:2012-06-19 09:13:56

标签: c# .net boolean switch-statement

我的问题不是如何解决这个错误(我已经解决了),但为什么这个错误的布尔值。

我的功能是

private string NumberToString(int number, bool flag)
{
    string str;

    switch(flag)
    {
        case true: 
            str = number.ToString("00");
            break;
        case false:
            str = number.ToString("0000"); 
            break;
    }

    return str;
}

错误是Use of unassigned local variable 'str'。布尔只能是真或假。因此,在任何一种情况下都会填充str。那为什么会出现这个错误?

此外,如果伴随着真假的情况我会添加一个default的情况,这个错误就消失了,但是仍然可以将bool与真假分开吗?

为什么bool变量有这种奇怪的行为?

5 个答案:

答案 0 :(得分:9)

在布尔变量上写一个switch语句对我来说似乎有些讨厌。为什么不使用条件运算符(?:):

private string NumberToString(int number, bool flag)
{
    return flag ? number.ToString("00") : number.ToString("0000"); 
}

代码似乎更简洁,您不需要局部变量。

但回到你的问题为什么你的代码不编译=>这是因为必须始终分配变量,并且这种赋值不应该发生在条件语句中。

答案 1 :(得分:6)

您得到的错误是string变量和 boolean可能的值。

没有办法没有cases运行的事实是真的(在这种情况下),但编译器在分析代码方面并没有这么做。它只是查看未在某些条件下分配和使用的变量,并且没有默认值,因此假设 可能在某些情况下仍然未分配。

答案 2 :(得分:4)

我想,你试图问,为什么str变量是未分配的,因为switch语句的情况会为它赋予一些值,但是编译器无法确定它是否会落入任何case语句中,这就是你在返回str时收到此错误的原因。

如果你添加一个带字符串赋值的默认情况,那么编译器肯定会知道str会保留一些值,这就是你没有得到错误的原因

答案 3 :(得分:3)

private string NumberToString(int number, bool flag)
{
    string str = "";

    switch(flag)
    {
        case true: 
            str = number.ToString("00");
            break;
        case false:
            str = number.ToString("0000"); 
            break;
    }

    return str;
}

写这个 string str = ""; - 您应该分配值

如果添加默认情况,则无法分配切换案例。现在是

答案 4 :(得分:0)

嗯,对于这个问题的原因有很好的解释,但还有一个问题的解决方案,没有提到。只需添加default而不是第二个case

    private string NumberToString(int number, bool flag)
    {
        string str;

        switch (flag)
        {
            case true:
                str = number.ToString("00");
                break;
            default:
                str = number.ToString("0000");
                break;
        }

        return str;
    }

由于我们始终在flag语句中分配default值,因此编译器不会对switch变量值有任何进一步的想法。

还要考虑if-else语句等效解决方案:

    private string NumberToString(int number, bool flag)
    {
        string str;

        if (flag)
            str = number.ToString("00");
        else
            str = number.ToString("0000");

        return str;
    }

我不是特别喜欢'one-liners'(单行解决方案),因为它们缺乏可扩展性而且还具有可读性,但作为最后的手段,只使用这样的三元运算符:

    private string NumberToString(int number, bool flag)
    {
        return flag ? number.ToString("00") : number.ToString("0000");
    }

当我在它时 - 考虑使用扩展方法+默认布尔值到false,例如:

public static class intExtensions
{
    public static string NumberToString(this int number, bool flag = false)
    {
        return flag ? number.ToString("00") : number.ToString("0000");
    }
}

然后在主要课程中:

        int intVal = 56;
        string strVal1 = intVal.NumberToString(true);
        string strVal2 = intVal.NumberToString();