3

我正在为班级分配作业,但无法编译。我不断得到"Use of unassigned local variable"两者multiplierStringMultiplcandString。在 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()
4

7 回答 7

2

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

于 2013-02-07T06:23:07.047 回答
1

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

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

于 2013-02-07T06:18:12.450 回答
0

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

string multiplicandString = null;
string multiplierString = null
于 2013-02-07T06:20:15.773 回答
0

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

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

由于这些无法评估编译时间,因此它会提供最佳反馈作为错误

所以最好初始化所有变量,比如

string multiplicandString ="";

string multiplierString ="";
于 2013-02-07T06:29:47.453 回答
0

尝试这个:

string multiplicandString = string.Empty;

string multiplierString = string.Empty;
于 2013-02-07T06:59:11.710 回答
0

您遇到的问题是编译器没有证据证明这些变量有赋值。我不同意其他建议使用 null 或空和变异进行初始化的答案。

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

于 2016-12-31T13:30:30.237 回答
-1

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

于 2013-02-07T06:35:10.543 回答