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;
}

错误是Use of unassigned local variable 'str'。Bool 只能取真或假。所以它会str在任何一种情况下填充。那为什么会出现这个错误?

此外,如果我添加一个案例以及真假案例,这个错误就消失了default,但是除了真假之外,布尔值还能保持什么?

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

4

5 回答 5

9

在布尔变量上编写 switch 语句对我来说似乎有点浪费。为什么不使用条件运算符 ( ?:):

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

代码看起来更简洁一些,你不需要局部变量。

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

于 2012-06-19T09:17:55.883 回答
7

您得到的错误是关于string变量而不是 boolean可能的值。

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

于 2012-06-19T09:18:42.763 回答
4

我想,你想问,为什么str变量是未赋值的,因为 switch 语句的 case 会为其分配一些值,但编译器无法确定它是否会落在任何 case 语句中,这就是你得到这个的原因返回时出错str

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

于 2012-06-19T09:17:46.663 回答
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 = "";- 你应该赋值

如果您添加默认案例,则没有机会在没有分配的情况下通过切换案例。现在它是

于 2012-06-19T09:16:05.117 回答
0

好吧,对于这个问题的原因已经有了很好的解释,但是对于这个问题还有一个解决方案,没有提到。只需放置default而不是 second 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变量值,因为我们总是defaultswitch语句中赋值。

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

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

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

        return str;
    }

我不是特别喜欢“单线”(单线解决方案),因为它们缺乏可扩展性和可读性,但作为最后的手段,只需使用这样的三元运算符:

    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();
于 2017-03-04T12:09:02.603 回答