使用未分配的局部变量c#error

时间:2014-04-22 21:44:28

标签: c# variables

如下所示,当我调试时,它给出了错误:错误1使用未分配的局部变量' moneyBet' 我不确定以下代码有什么问题。我以前从来没有得过类似的东西。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyNotSoVeryFirstApplication
{
class Program
{
    static void Main(string[] args)
    {
        bool stillGoing = true;
        int moneyBet;
        int moneyInBank = 0; //change 0 to amount held in actuality
        while (stillGoing == true)
        {
            Console.WriteLine("Money in bank : {0}", moneyInBank);
            Console.WriteLine("----------------------------------------------------");
            Console.Write("Enter amount you would like to bet: ");
            string moneybetString = Console.ReadLine();
            try
            {
                moneyBet = Convert.ToInt32(moneybetString);
            }
            catch (FormatException e)
            {
                Console.WriteLine(e.Message);
            }
            catch (OverflowException e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                if (moneyBet > Int32.MaxValue)
                Console.WriteLine("You are about to bet {0}. Are you sure you want to bet this amount?", moneyBet);
            }
        }
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey(); 
    }
}

}

5 个答案:

答案 0 :(得分:1)

在您在行中阅读之前,您需要明确指定moneyBet

if (moneyBet > Int32.MaxValue)

如果Convert.ToInt32(moneybetString);抛出异常,则不会分配它。

规范描述了try / finally块中明确赋值的规则:

5.3.3.14尝试终结声明

  

对于表单的try语句stmt:最后尝试 try-block   最后块

     

•finally块开始时v的明确赋值状态   与开头的v的明确赋值状态相同   语句。

moneybetString在try块之前没有明确赋值,因此在finally块的开头没有明确赋值。

最简单的解决方案是在声明点分配初始值:

int moneyBet = 0;

另请注意,由于moneyBet为int且不能超过int.MaxValue,因此您的情况将始终为假。

答案 1 :(得分:1)

Finally无论如何都会被调用。因此,如果存在异常,则仍会在moneyBit语句中调用if。因此,您得到一个赋值错误,因为它从未被赋值(Convert.ToInt32(moneybetString)抛出了异常)。

您需要在声明或使用Int32.TryParse时为其指定值。

答案 2 :(得分:0)

您在try-block中分配moneyBet,但如果抛出异常,则在finally块中使用未分配的变量。只需将int moneyBet;更改为int moneyBet = 0;,就可以了

答案 3 :(得分:0)

尝试int moneyBet=0;

在您的代码中,如果try块失败,那么在finally块中,moneyBet将保持未分配状态。

答案 4 :(得分:0)

当你声明变量moneyBet时,如果在Convert.ToInt32期间抛出异常,moneyBet将保持未分配状态,因为catch块中没有分配,因此当你到达finally块时,moneyBet是未分配的。