我是C#的新手,我的问题可能很简单,但我不明白:
我需要根据条件为数组分配一些值。 所以我可以使用“if”的“switch”语句来检查条件。
但是,如果我使用“switch”,那么我会收到错误“已在此范围内定义的局部变量”。
如果我使用“if”,那么我会收到错误“当前上下文中不存在”
示例:
int x;
x=1;
//1:
//a) does work...
if (x==1)
{
string[,] arraySpielfeld2d =
{
{"1", "1" },
{"1", "1" }
};
}
else
{
string[,] arraySpielfeld2d =
{
{"1", "1" },
{"1", "1" }
};
}
//b) but this does not work
MessageBox.Show(arraySpielfeld2d[0,0]); //error: does not exist in current context
//2) doesn't work at all
switch (x)
{
case 1:
string[,] arraySpielfeld2d =
{
{"1", "1" },
{"1", "1" }
};
break;
case 2:
string[,] arraySpielfeld2d = //error:Local variable already defined in this scope
{
{"2", "2" },
{"2", "2" }
};
break;
}
所以使用“if”我至少可以填充数组(1a)......但我无法访问数组元素(1b)...... 使用“开关”根本不起作用。
那么我如何根据条件(if / switch)分配然后访问数组?
我使用Visual Studio 2010。
感谢
答案 0 :(得分:4)
您在这里遇到的是变量的范围。
在块{ }
内声明的任何变量仅在该块中可见。块后面的任何代码都无法看到它。因此,你的if
- 使用代码声明了变量,但它在这两个分支中这样做,因此之后的代码根本无法看到它。
解决方案是在if
之前声明变量,将其分配到块中,然后您可以在之后使用它(只是确保您不会留下可以最终取消分配的路径,除非你在使用它时为这种可能性做好准备)。
switch
代码不起作用,因为整个语句只有一个块,并且在其中声明了两次相同的变量名。
它仍然具有相同的范围问题,因为该变量在switch
块之外不可见。同样,解决方案是首先声明变量,然后在switch
。
答案 1 :(得分:3)
您已在if
的范围内声明了数组,但您想从外部访问它。这不起作用。你必须在外面宣布它。但是你不能使用集合初始化器语法:
int x;
x=1;
string[,] arraySpielfeld2d = new string[2,2];
if (x == 1)
{
arraySpielfeld2d[0,0] = "1";
arraySpielfeld2d[0,1] = "1";
arraySpielfeld2d[1,0] = "1";
arraySpielfeld2d[1,1] = "1";
}
else if(x == 2)
{
arraySpielfeld2d[0, 0] = "2";
arraySpielfeld2d[0, 1] = "2";
arraySpielfeld2d[1, 0] = "2";
arraySpielfeld2d[1, 1] = "2";
}
MessageBox.Show(arraySpielfeld2d[0,0]);
对于switch
也是如此,如果您使用大括号({ }
),它也会创建新范围。
请注意,在这种情况下,您不需要if
或switch
,您似乎总是希望使用x
:
string val = x.ToString();
string[,] arraySpielfeld2d =
{
{val, val },
{val, val }
};
答案 2 :(得分:0)
在arraySpielfeld2d
或if/else
范围之外声明switch
,然后您可以在if/else
之外和switch
答案 3 :(得分:0)
以下是你的代码应该如何开始,基本上你在if-then-else中锁定了变量的范围,它需要在括号外声明。
int x;
x=1;
// define variable OUTSIDE of the if-then-else scope
string[,] arraySpielfeld2;
or
string[2,2] arraySpielfeld2 = new string[2,2]();
if (x==1)
{
// assign the variable here if you create it then scope is
// restricted to the code between if-then-else
// unlike javascript you can't define a global
// variable here (by leaving off the var part)
arraySpielfeld2d = ... snipped
}