如果语句不能改变局部变量

时间:2012-04-18 08:41:59

标签: c# if-statement

为什么我不能用if语句改变值?

        int amount;
        string inputbalk = inputbar.Text;

        if (inputbalk== string.Empty)
        {
            amount = Convert.ToInt32(inputbalk);
            amount = 1;
        }

        if (inputbalk != string.Empty)
        {
            amount = Convert.ToInt32(inputbalk);
            amount = 1;
        }

        int onepercent = amount/= 100;

即使我用两个不同的if语句将它设置为1,它也会将“amount”视为未分配的变量。

如果我调试,我得到这个: “错误1使用未分配的局部变量'amount'”


感谢您的帮助,这是固定/解决的。

7 个答案:

答案 0 :(得分:3)

只需更改第二个否则

        if (inputbalk== string.Empty)
        {
            amount = Convert.ToInt32(inputbalk);
            amount = 1;
        }
        else
        {
            amount = Convert.ToInt32(inputbalk);
            amount = 1;
        }

编译器无法确保两个if语句中的一个无论如何都会起作用,因此会产生错误,即您的变量可以 unassigned

if/else表示法中,无论如何都会完成两个代码块中的一个,因此编译器不会抛出错误,一切都会按照您的意愿运行。

答案 1 :(得分:1)

因为您可能不会进入任何if语句,从而将金额保留为未分配。你会在这一行得到错误:

 int onepercent = amount /= 100;

在编译时,编译器将无法确定是否有任何if语句将导致true和设置金额。为了避免这个错误你可以(开始时):

int amount=-1;

现在你不会得到你的编译器错误,数量的值会在if语句中改变。附: ('如果'是一个陈述而不是一个循环)

答案 2 :(得分:1)

有把inputbalk作为null的机会:)

答案 3 :(得分:1)

  1. if 一个循环
  2. 考虑inputbalkstring可以null,您不会检查它,因此可以碰巧是你的情况。
  3. 更改您的代码,如下所示:

    if (string.IsNullOrEmpty(inputbalk))
    {
         amount = Convert.ToInt32(inputbalk);
         amount = 1;
    }
    
    else
    {
        amount = Convert.ToInt32(inputbalk);
        amount = 1;
    }
    

    希望这有帮助。

答案 4 :(得分:1)

问题是编译器无法看到该数量是明确分配的。 知道inputBalk在第一次和第二次评估之间无法更改,而且恰好其中一个if条件为真,但编译器不会检查这一点。它只看到在使用之前没有分配金额的路径,这是不允许的。

你应该使用if / else而不是两次测试相同的条件。

if (...)
{
    amount = 1;
}
else
{
    amount = 2;
}

现在,编译器可以看到代码中的每个可能路径都会导致数量明确分配。

还有许多其他优点:代码更简洁,更易于阅读和更易于维护。此外,不进行两次相同的检查会带来轻微的性能优势。

答案 5 :(得分:1)

但是,您也可以使用Convert.ToInt32()方法遇到FormatException。考虑使用int.tryParse作为替代方案。

答案 6 :(得分:0)

给这个爆炸:

if (!int.TryParse(inputbar.Text, out amount))
    amount = 1;