Недостижимый код Visual Studio С# сделать цикл while

Я пытаюсь написать код (в Visual Studio 2012 с использованием С#), который позволит пользователю выбрать учетную запись, используя 1,2,3 или 4. Я использую цикл do-while, поэтому я могу использовать 0 для выхода (перерыв? ) или снова запустите цикл, пока не будет выбран допустимый вариант.

Проблема в том, что Visual Studio сообщает мне, что код validAccount = true; недоступен, и не позволяет мне его протестировать. поскольку этот метод также должен возвращать значение, у меня возникает ошибка «не все пути кода возвращают значение», и я действительно запутался. вот мой код:

    static int chooseAccount() {
        bool validAccount = false;
        do {
            Console.Clear();
            Console.WriteLine("Select an Account: \r\n 1: Savings \r\n 2: Debit \r\n 3: Credit \r\n 4: Investment");
            int inputNumber = int.Parse(Console.ReadLine()); //by declaring int inputNumber here we save having an extra line.
            if ((inputNumber >= 1) && (inputNumber <= 4)) {
                return inputNumber;
                validAccount = true;
            }
            else if (inputNumber == 0) {
                break;
            }
            else {
                Console.WriteLine("Error: please choose an account using 1, 2, 3, 4 or 0 to exit");
            }
        } while (!validAccount);
    }//end chooseAccount

Может быть, я просто слишком долго смотрел на это и не вижу простой ошибки, которую я сделал. Я приветствую свежую точку зрения или направление, где я могу найти решение, если такая проблема уже решена. (это довольно сложно найти в Google что-то вроде «недоступного кода», когда код должен быть таким конкретным...)


person Kuro    schedule 06.09.2013    source источник
comment
Строка после оператора return return inputNumber; не будет выполняться. Вам не нужно устанавливать validAccount, потому что его значение исчезает из стека, когда вы возвращаетесь из функции.   -  person dcaswell    schedule 06.09.2013
comment
поскольку вы либо возвращаетесь, либо выходите из цикла, вся логика validAccount в любом случае избыточна. do{} while(true) будет достаточно   -  person Serve Laurijssen    schedule 06.09.2013
comment
Спасибо всем за ваши быстрые ответы! очень быстро решил эту проблему! у меня все еще есть не все пути кода, возвращающие ошибку значения, есть понимание?   -  person Kuro    schedule 06.09.2013
comment
Проверьте мой ответ на исправление этой ошибки.   -  person mdenton8    schedule 06.09.2013


Ответы (3)


Строка с ошибкой идет сразу после оператора return. Ваш код в каждом отдельном случае (и компилятор знает об этом) будет выходить из функции в строке перед ней, поэтому он никогда не достигнет следующей строки.

Вам не нужно устанавливать validAccount в true, чтобы разорвать цикл, потому что оператор return завершит функцию и, следовательно, автоматически выйдет из цикла.

И, наконец, если вы установите validAccount в значение true, а ЗАТЕМ вернетесь, никакая другая функция не сможет получить доступ к validAccount, так зачем вам нужно было устанавливать для него значение true?

По правде говоря, вам вообще не нужно validAccount, потому что с вашими операторами break и return вы уже контролируете вход в цикл и выход из него. Это будет работать:

static int chooseAccount() {
    while(true) {
        Console.Clear();
        Console.WriteLine("Select an Account: \r\n 1: Savings \r\n 2: Debit \r\n 3: Credit \r\n 4: Investment");
        int inputNumber = int.Parse(Console.ReadLine());
        if ((inputNumber >= 0) && (inputNumber <= 4)) {
            return inputNumber;
        }
        else 
        {
            Console.WriteLine("Error: please choose an account using 1, 2, 3, 4 or 0 to exit");
        }
    }
}
person mdenton8    schedule 06.09.2013
comment
Этот код позволяет избежать того, что не все пути кода также возвращают значение, но возвращает 0. Вы должны настроить свой код так, чтобы он также работал с возвращаемым 0. - person mdenton8; 06.09.2013
comment
Раньше вы выходили из цикла break, если пользователь вводил 0, а затем после вашего цикла не было кода, и поэтому функция попадала в конечную фигурную скобку и ничего не возвращала. Функция всегда должна возвращать значение при объявлении возвращаемого типа, поэтому компилятор выдает ошибку. - person mdenton8; 06.09.2013
comment
Спасибо, это действительно помогло! именно то, что мне было нужно! - person Kuro; 06.09.2013
comment
Без проблем. Удачи с вашей программой! - person mdenton8; 06.09.2013

Имейте в виду, что оператор return немедленно выведет вас из функции. Тогда следующий validAccount = true; никогда не будет выполнен!

person Ramon Araujo    schedule 06.09.2013
comment
Спасибо, это решило одну проблему! Я все еще получаю, что не все пути кода возвращают ошибку значения, и я не могу запустить, чтобы проверить это. - person Kuro; 06.09.2013

Поменяйте местами эти два:

return inputNumber;
validAccount = true;
person Gerrie Schenck    schedule 06.09.2013
comment
Нет причин устанавливать validAccount. Вы не можете получить доступ к validAccount после возврата функции. - person dcaswell; 06.09.2013