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。仪式,左;
每当我尝试编译代码时,它都会显示错误消息“当前上下文中不存在名称'左'。”与整数仪式相同。
答案 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)
left
和rite
仅存在于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块中进行分配即可。
除此之外,如果发生错误,您应该退出该函数,因为稍后出现的代码期望rite
和left
有效,如果该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块之外。