C#:错误使用if / switch:"已在此范围内定义的局部变量"

时间:2015-01-06 13:35:14

标签: c# arrays

我是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。

感谢

4 个答案:

答案 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也是如此,如果您使用大括号({ }),它也会创建新范围。

请注意,在这种情况下,您不需要ifswitch,您似乎总是希望使用x

string val = x.ToString();
string[,] arraySpielfeld2d = 
{
     {val, val },
     {val, val }
};

答案 2 :(得分:0)

arraySpielfeld2dif/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
  }