如下所示,当我调试时,它给出了错误:错误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();
}
}
}
答案 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是未分配的。