![](/img/trans.png)
[英]I declare a variable in C# and cannot use it inside of the switch statement
[英]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中需要什么值,如果引发异常,则要保留哪些值。
left
和rite
仅存在于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块中进行分配即可。
除此之外,如果发生错误,则应该退出该函数,因为后面的代码期望rite
并left
有效,而如果执行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.