我声明一个变量,不能在switch语句中使用它

时间:2011-08-01 22:06:09

标签: c# .net scope switch-statement

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。仪式,左;
每当我尝试编译代码时,它都会显示错误消息“当前上下文中不存在名称'左'。”与整数仪式相同。

9 个答案:

答案 0 :(得分:5)

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;
    }

虽然这还不够,但是你必须在rite中决定你想要的值,如果抛出异常则离开。

答案 1 :(得分:1)

leftrite仅存在于try代码块中。

答案 2 :(得分:0)

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);
}

答案 3 :(得分:0)

是的,因为你已经在try / catch块的范围内声明了rite(我认为你的意思是“正确”......)和left。如果第一次拨打Convert.ToDecimal失败会怎样?那么,rite从未被分配,left从未被宣布过。你需要将它们提升到一个级别并在try / catch之外声明它们。只需在try块中进行分配即可。

除此之外,如果发生错误,您应该退出该函数,因为稍后出现的代码期望riteleft有效,如果该catch处理程序执行它们将不会出现

答案 4 :(得分:0)

将“rite”和“left”的声明与gr和sum一起使用。

答案 5 :(得分:0)

它们在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)是不值得的,真的。

答案 6 :(得分:0)

您在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;
        }

这是正确的答案。 它被称为变量范围。

答案 7 :(得分:0)

两个变量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;

        }

答案 8 :(得分:0)

要么包含try块内的所有逻辑(switch),要么将变量声明移到try块之外。