C#变量声明在While循环中分配,但获取'未分配'编译错误

时间:2013-02-07 06:16:07

标签: c# variables console-application

我正在为课程分配工作而我无法编译。我一直"Use of unassigned local variable"multiplierString获得MultiplcandString。声明在main的顶部声明,但它似乎没有在while循环中为它们赋值。如果我强制循环外的值,则错误消失。非常感激任何的帮助。感谢。

这里发生了什么?

static void Main()
{

    bool goodInput = false;
    ConsoleKeyInfo cki;
    string multiplicandString;
    string multiplierString;
    string endProduct;
    string prompt;
    string response;
    Int64 TryNumber;

    prompt = "This program will multiply two numbers of reasonable length.";
    Console.WriteLine(prompt);
    Console.WriteLine();
    prompt = "Press the Escape (Esc) key to quit or any other key to continue.";
    cki = Console.ReadKey();

    if (cki.Key != ConsoleKey.Escape)
    {
        while (!goodInput)
        {
            prompt = "Please provide the multiplicand: ";
            Console.WriteLine(prompt);
            response = Console.ReadLine();

            if (Int64.TryParse(response, out TryNumber))
            {
                goodInput = true;
                multiplicandString = "a"; //TryNumber.ToString();
            }
            else
            {
                Console.WriteLine();
                prompt = "Invalid multiplicand entry. It must be all numbers.\a";
                Console.WriteLine(prompt);
                prompt = "Please try again.";
                Console.WriteLine(prompt);
            } // end if Int64.TryParse
        } // end while ! goodInput

        goodInput = false;

        while (!goodInput)
        {
            prompt = "Please provide the multiplier: ";
            Console.WriteLine(prompt);
            response = Console.ReadLine();

            if (Int64.TryParse(response, out TryNumber))
            {
                goodInput = true;
                multiplierString = "a"; //TryNumber.ToString();
            }
            else
            {
                Console.WriteLine();
                prompt = "Invalid multiplier entry. It must be all numbers.\a";
                Console.WriteLine(prompt);
                prompt = "Please try again.";
                Console.WriteLine(prompt);
            } // end if Int64.TryParse
        } // end while ! goodInput
          //multiplierString = "a"; //TryNumber.ToString();

        endProduct = MultiplyByRectangle(multiplicandString, multiplierString);

        Console.WriteLine("The result of the calculation is:");
        Console.WriteLine("\t" + endProduct);

    } // end Main()

7 个答案:

答案 0 :(得分:2)

C#需要明确分配变量。意思是,变量必须先设置为初始值才能读取。

答案 1 :(得分:1)

在C#中,必须在第一次读取操作之前明确分配局部变量。在你的情况下,几个变量只在一个循环中初始化,而循环并不是绝对肯定会运行。

如果用户立即按下Esc键,这些变量真的会被取消分配,不是吗?

答案 2 :(得分:0)

您收到错误,因为编译器无法确定您是否将进入while循环。您可以为它们分配一些默认值,例如`null;

string multiplicandString = null;
string multiplierString = null

答案 3 :(得分:0)

在这种情况下,编译器无法猜测您声明的变量将被赋值。

如果它没有进入循环,即使它只移动到else块,该怎么办。

由于这些不能在编译时评估,因此它提供了最佳反馈

因此最好初始化所有变量,例如

string multiplicandString ="";

string multiplierString ="";

答案 4 :(得分:0)

试试这个:

string multiplicandString = string.Empty;

string multiplierString = string.Empty;

答案 5 :(得分:0)

您遇到的问题是编译器没有证明存在为这些变量分配的值。我不同意其他建议用null或空和变异初始化的答案。

如果你将两个while循环拉入它们自己的函数,返回字符串,你可以在声明它们时初始化它们。

答案 6 :(得分:-1)

TryParse成功后,multiplierString 分配。但是当输入无效时,else分支会运行,而multiplierString 不会分配。然后在elsemultiplierString被读取之后。这是非法的。