繁体   English   中英

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

[英]I declare a variable and cannot use it inside of the 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。 仪式,左;
每次我尝试编译代码时,它都会显示错误消息“当前上下文中不存在名称'left'”。 与整数仪式相同。

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中需要什么值,如果引发异常,则要保留哪些值。

leftrite仅存在于try代码块内。

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

是的,因为您已声明rite (我认为您的意思是“正确” ...),并left在try / catch块的范围内。 如果第一次对Convert.ToDecimal调用失败怎么办? 好吧,那么rite从来没有被分配过,甚至从未被宣布left过。 您需要将它们提高一个级别,并在try / catch之外声明它们。 只需从try块中进行分配即可。

除此之外,如果发生错误,则应该退出该函数,因为后面的代码期望riteleft有效,而如果执行catch处理程序,则不会生效。

将“ rite”和“ left”的声明与gr和sum一起放入。

它们在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;

    }

PS保存一个字符(用rite代替right )确实不值得。

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

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

仅将try块和switch块无法访问这两个变量rite,left声明为局部变量,

您应该声明两个块都可以访问它们

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;

        }

将所有逻辑(开关)包含在try块内,或者将变量声明移到try块外。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM