3

クラスの課題に取り組んでいますが、コンパイルできません。"Use of unassigned local variable"との両方multiplierStringを取得し続けMultiplcandStringます。メインの先頭で宣言されていますが、 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

この場合のコンパイラは、宣言した変数に値が割り当てられることを推測できません。

ループに入らず、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

while ループに入るかどうかをコンパイラが判断できないため、エラーが発生しています。`null; などのデフォルト値を割り当てることができます。

string multiplicandString = null;
string multiplierString = null
于 2013-02-07T06:20:15.773 に答える
-1

TryParse成功すると、multiplierString 割り当てられます。ただし、入力が無効な場合、elseブランチが実行され、割り当てられmultiplierStringません。次に、elseブロックmultiplierStringが読み取られた後。これは違法です。

于 2013-02-07T06:35:10.543 に答える