Переменная C #, объявленная вне цикла, назначается в Loop, но получает сообщение «Unassigned» Compile Error

Я работаю над заданием для класса, и я не могу его скомпилировать. Я продолжаю получать «Использование неназначенной локальной переменной» для 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()
3
Кроме того, в вашем коде отсутствует закрывающая скобка для if (cki.Key! = ConsoleKey.Escape) {...
добавлено автор horgh, источник
Подумайте, что произойдет, если самый первый ключ, который пользователь нажимает, - Esc.
добавлено автор Matthew Watson, источник
попробуйте назначить в качестве "" или string.empty
добавлено автор Dnyan Waychal, источник

7 ответы

C # нужны переменные, которые будут определенно назначены. Значение, переменные должны быть установлены с начальным значением, прежде чем вы сможете его прочитать.

2
добавлено

В C# локальная переменная должна быть обязательно назначена перед первой операцией чтения. В вашем случае несколько переменных инициализируются только внутри цикла, в то время как цикл не обязательно работает.

Если пользователь нажимает клавишу Esc сразу, эти переменные будут действительно неназначенными, не так ли?

1
добавлено

Когда TryParse завершается успешно, назначается multiplierString . Но когда вход недействителен, ветвь else запускается, а multiplierString - not . Затем после чтения else блок multipierString . Это незаконно.

1
добавлено

попробуй это:

string multiplicandString = string.Empty;

string multiplierString = string.Empty;
0
добавлено
Позаботьтесь, чтобы комментировать/объяснить, что не так в моем ответе, мистер Downvoter?
добавлено автор Christian Mark, источник

Вы получаете ошибку, потому что компилятор не может определить, будет ли вы вводить цикл while или нет. Вы можете присвоить им определенное значение по умолчанию, например `null;

string multiplicandString = null;
string multiplierString = null
0
добавлено
@JeppeStigNielsen, да, это было бы идеально, но иногда это не просто возможно, например, если вы настраиваете что-то в блоке if, а затем возвращаете его вне своего блока if. Присвоение чего-то в блоке try, а затем использование его снаружи было бы лучшим примером
добавлено автор Habib, источник
Но это не полезно, если вы не хотите использовать значения null . Вместо этого измените поток программы, чтобы переменная никогда не читалась до того, как она будет назначена (с допустимым значением).
добавлено автор Jeppe Stig Nielsen, источник
Согласились, что могут быть сложные случаи. Но в сценарии try - catch я предпочитаю назначать внешнюю переменную как в блоке try , так и в catch блок (ы). Или сделать конец блока catch неустранимым с помощью return ing или ref throw ing из него. Если вы решите инициализировать с помощью null , компилятор не поможет вам определить, было ли присвоено «хорошее» значение, и вместо этого вы получите проблему. Конечно, если null считается «хорошим значением» в ситуации, у меня нет никаких возражений.
добавлено автор Jeppe Stig Nielsen, источник

Проблема, которую вы имеете, это компилятор, не имеет доказательств того, что есть значение, присвоенное этим переменным. Я не согласен с другими ответами, которые предполагают инициализацию с нулевым или пустым и мутированием.

Если вы вытащите свои два цикла while в свои собственные функции, вернув строку, вы можете инициализировать их в том месте, где вы их объявляете.

0
добавлено

Компилятор в этом случае не может догадаться, что объявленной переменной будет присвоено значение.

Что делать, если он не входит в цикл и даже если он перемещается только в блок else.

Поскольку они не могут быть оценены временем компиляции, это дает лучшую обратную связь как ошибку

Поэтому лучше инициализировать все ваши переменные, такие как

string multiplicandString ="";

string multiplierString ="";
0
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot