Я объявляю переменную и не могу использовать ее внутри оператора switch - PullRequest
0 голосов
/ 02 августа 2011
string gr = comboBox1.ValueMember;
decimal sum = 0M;
try
{
    decimal rite = Convert.ToDecimal(textBox1.Text);
    decimal left = Convert.ToDecimal(textBox2.Text);
}
catch (Exception)
{
    string swr = "Please enter REAL a number, can be with decimals";
    label2.Text = swr;
}
switch (gr)
{
    case "X":

        sum = rite * left;
        break;
    case "/":

        break;
    case "*":
        break;
    case "-":
        break;
    default:

        break;

}
answerText.Text = Convert.ToString(sum);

У меня проблемы с изменением других переменных вне оператора switch - EX.обряд, слева;Каждый раз, когда я пытаюсь скомпилировать код, он появляется с сообщением об ошибке «имя« left »не существует в текущем контексте».и то же самое с целочисленным обрядом.

Ответы [ 9 ]

5 голосов
/ 02 августа 2011

rite и left доступны только в той области, где они объявлены, то есть внутри блока try.

Вам нужно сделать что-то вроде этого

    decimal rite = 0m;
    decimal left = 0m;
    try
    {
        rite = Convert.ToDecimal(textBox1.Text);
        left = Convert.ToDecimal(textBox2.Text);
    }
    catch (Exception)
    {
        string swr = "Please enter REAL a number, can be with decimals";
        label2.Text = swr;
    }

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

1 голос
/ 02 августа 2011

left и rite существуют только внутри кодового блока try.

0 голосов
/ 02 августа 2011

Либо включите всю логику (переключатель) внутри блока try, либо переместите объявление переменной вне блока try.

0 голосов
/ 02 августа 2011

две переменные rite, left объявлены как локальные только для блока try, а блок switch не может получить к нему доступ,

вы должны объявить их доступными для двух блоков

decimal rite=0m;
decimal left=0m;
        try
        {
            rite = Convert.ToDecimal(textBox1.Text);
            left = Convert.ToDecimal(textBox2.Text);
        }
        catch (Exception)
        {
            string swr = "Please enter REAL a number, can be with decimals";
            label2.Text = swr;
        }
        switch (gr)
        {
            case "X":

                sum = rite * left;
                break;
            case "/":

                break;
            case "*":
                break;
            case "-":
                break;
            default:

                break;

        }
0 голосов
/ 02 августа 2011

Вы объявляете левый и правый операторы try, поэтому они не существуют вне оператора try.

        decimal rite;
        decimal left;

        try
        {
           rite = Convert.ToDecimal(textBox1.Text);
           left = Convert.ToDecimal(textBox2.Text);
        }
        catch (Exception)
        {
            string swr = "Please enter REAL a number, can be with decimals";
            label2.Text = swr;
        }

Это правильный ответ.Его называют переменной областью действия.

0 голосов
/ 02 августа 2011

Они объявлены в блоке try и, следовательно, относятся к нему.
Кроме того, что вы ожидаете от любого из них в случае исключения в блоке try? Их нужно инициализировать. (Я предполагал, что у вас все в порядке с нулями в качестве значений по умолчанию.)

Переместите их наружу:

    string gr = comboBox1.ValueMember;
    decimal left = 0M, right = 0M, sum = 0M; // assuming you want zeroes by default
    try
    {
        right = Convert.ToDecimal(textBox1.Text);
        left = Convert.ToDecimal(textBox2.Text);
    }
    catch (Exception)
    {
        string swr = "Please enter REAL a number, can be with decimals";
        label2.Text = swr;
    }
    switch (gr)
    {
        case "X":

            sum = right * left;
            break;
        case "/":

            break;
        case "*":
            break;
        case "-":
            break;
        default:

            break;

    }

P.S. На самом деле сохранение одного символа (rite вместо right) не стоит усилий.

0 голосов
/ 02 августа 2011

Поместите объявление "rite" и "left" вместе с gr и sum.

0 голосов
/ 02 августа 2011

Да, потому что вы объявили rite (я думаю, что вы имеете в виду "правильно" ...) и left в области действия блока try / catch. Что произойдет, если первый вызов Convert.ToDecimal не удастся? Ну, тогда rite никогда не был назначен, а left никогда даже не был объявлен. Вы должны поднять их на уровень и объявить их вне try / catch. Просто выполните назначение из блока try.

Кроме того, вы должны выйти из функции, если произойдет ошибка, так как код, который приходит позже, ожидает, что rite и left будут действительными, чего не будет, если этот обработчик перехвата выполнится.

0 голосов
/ 02 августа 2011

rite и left являются локальными по отношению к вашей инструкции try.Вам нужно объявить их вне вашего оператора try, а затем назначить их значения внутри.

например.

    string gr = comboBox1.ValueMember;
    decimal sum = 0M;
    decimal rite= 0M;
    decimal left= 0M;
    try
    {
        rite = Convert.ToDecimal(textBox1.Text);
        left = Convert.ToDecimal(textBox2.Text);
    }
    catch (Exception)
    {
        string swr = "Please enter REAL a number, can be with decimals";
        label2.Text = swr;
    }
    switch (gr)
    {
        case "X":

            sum = rite * left;
            break;
        case "/":

            break;
        case "*":
            break;
        case "-":
            break;
        default:

            break;

    }
    answerText.Text = Convert.ToString(sum);
}
...