使用未赋值的局部变量 c# 错误

本文关键字:局部变量 错误 赋值 | 更新日期: 2023-09-27 17:59:21

如下,当我调试时,它给了我错误: 错误 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(); 
    }
}

}

使用未赋值的局部变量 c# 错误

在阅读

该行之前,您需要明确分配moneyBet

if (moneyBet > Int32.MaxValue)

如果Convert.ToInt32(moneybetString);引发异常,则不会分配该异常。

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

5.3.3.14 最终尝试语句

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

• 最终块开头 v 的确定赋值状态 与 V 开头的确定赋值状态相同 标准时间。

moneybetString 在 try 块之前没有明确分配,因此在读取它的 finally 块的开头没有明确分配。

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

int moneyBet = 0;

另请注意,您的条件将始终为假,因为moneyBet是一个整数,不能超过 int.MaxValue

无论如何

都会调用Finally。因此,如果存在异常,moneyBit仍会在该if语句中调用。因此,您会收到一个分配错误,因为它从未被分配(异常由 Convert.ToInt32(moneybetString) 引发(。

要么在声明它时需要为其赋值,要么使用 Int32.TryParse .

你在

try块中分配moneyBet,但如果这引发异常,你就是在final块中使用未赋值的变量。只需将int moneyBet;更改为int moneyBet = 0;即可

尝试int moneyBet=0;

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

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