Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我声明了一个变量,不能在switch语句中使用它_C#_.net_Scope_Switch Statement - Fatal编程技术网

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

C# 我声明了一个变量,不能在switch语句中使用它,c#,.net,scope,switch-statement,C#,.net,Scope,Switch Statement,我在修改switch语句之外的其他变量时遇到问题-例如,rite,左 每次我尝试编译代码时,它都会显示错误消息“名称'left'在当前上下文中不存在”。整数rite也是如此。rite和left只能在声明它们的范围内访问,即在try块内 你需要这样做 string gr = comboBox1.ValueMember; decimal sum = 0M; try { decimal rite = Convert.ToDecimal(textBox1.Text); decimal l

我在修改switch语句之外的其他变量时遇到问题-例如,rite,左

每次我尝试编译代码时,它都会显示错误消息“名称'left'在当前上下文中不存在”。整数rite也是如此。

rite和left只能在声明它们的范围内访问,即在try块内

你需要这样做

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

尽管这还不够,因为如果引发异常,您必须决定在rite和left中需要什么值。

rite和left只能在声明它们的范围内(即在try块内)访问

你需要这样做

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

尽管这还不够,因为如果抛出异常,您必须决定在rite和left中需要什么值。

rite和left是try语句内部的本地值。您需要在try语句外部声明它们,然后在内部分配它们的值

例如


rite和left是try语句内部的局部变量。您需要在try语句外部声明它们,然后在内部分配它们的值

例如


是的,因为您在try/catch块的范围内声明了
rite
(我认为您的意思是“right”…)和
left
。如果对
Convert.ToDecimal
的第一次调用失败,会发生什么?那么,
rite
从来没有被分配过,
left
甚至从来没有被声明过。您需要将它们提升到一个级别,并在try/catch之外声明它们。只需在try块中执行赋值


除此之外,如果出现错误,您应该退出该函数,因为后面的代码希望
rite
left
有效,如果catch处理程序执行,它们就不会有效。

是的,因为您已声明
rite
(我认为您的意思是“right”…)在try/catch块的作用域内左
。如果对
Convert.ToDecimal
的第一次调用失败,会发生什么?那么,
rite
从来没有被分配过,
left
甚至从来没有被声明过。您需要将它们提升到一个级别,并在try/catch之外声明它们。只需在try块中执行赋值


除此之外,如果出现错误,您应该退出该函数,因为后面的代码预期
rite
left
有效,如果catch处理程序执行,它们就不会出现。

left
rite
仅存在于
try
代码块中。

left
rite
仅存在于
try
代码块中。

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

将“rite”和“left”以及gr和sum。

它们在
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
而不是
right
)确实不值得努力。

它们是在
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
而不是
right
)确实不值得这么做。

您在try语句中声明了left和right,因此它们不存在于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;

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

您在try语句中声明left和right,因此它们不存在于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;

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

左侧的两个变量rite被声明为本地变量,仅用于try块,switch块无法访问它

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

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

rite,left这两个变量被声明为仅用于try块的本地变量,switch块无法访问它

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

        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块内的所有逻辑(开关)或将变量声明移到try块外。

包括try块内的所有逻辑(开关)或将变量声明移到try块外。

请不要将“C#“在标题前面,表示它是关于C的。这就是我们在这里使用标记的原因。有一个提示:拼写正确,而不是礼仪:请不要在标题前加上“C”,表示它是关于C的。这就是我们在这里使用标记的原因。一个提示拼写正确,而不是rite:p这段代码有点错误
left
right
try
-
catch
之外使用,当您到达
开关时,它们可能未初始化。声明时需要初始化。我猜catch中可能应该有一个return语句,以防止其余的计算发生。这段代码有点错误
left
right
try
-
catch
之外使用,当您到达
开关时,它们可能未初始化。初始化在声明时是必要的。我猜在catch中可能应该有一个return语句来防止其余的计算发生。