编译错误:'x'与'y.x'的声明冲突?

时间:2012-03-18 07:16:41

标签: c# compiler-errors

我收到了这些错误:

  

'Map'与声明'COServer.Map'

冲突      

无法在此范围内声明名为“Map”的局部变量,因为它会为“Map”赋予不同的含义,“Map”已在“父级或当前”范围中用于表示其他内容

这是我的代码:

foreach (int[] RevP in Map.RevPoints)
{
    if (RevP[0] == (int)(Client.Char.Map))
    {
        Client.Char.Map = (Map.Maps)(RevP[1]);
        Client.Char.CurrentLoc = new Location(RevP[2], RevP[3]);
        Client.Char.PreviousLoc = new Location(RevP[2], RevP[3]);
        break;
    }
}

foreach (int[][][] Map in Database.Maps)
{
    if (Map[1][0][0] == (int)(Client.Char.Map))
    {
        foreach (int[] Chars in Map[2])
        {
            if (Chars[0] == 0)
            {
                Chars[0] = Client.Char.CharID;
                Chars[1] = Client.Char.CurrentLoc.X;
                Chars[2] = Client.Char.CurrentLoc.Y;
                break;
            }
        }
        break;
    }
}

3 个答案:

答案 0 :(得分:4)

C#不允许在重叠的块中以两种不一致的方式使用相同的“简单名称”,因为这样做会导致难以理解或重构的代码混乱。以下是代码的简化版本,用于演示此问题:

class Map
{
   public static int[] RevPoints = { };
}
class P
{
    void Main()
    {
        int[] maps = { };
        // Here the simple name Map means the type:
        foreach (int i in Map.RevPoints) {}
        // Here the simple name Map means the loop variable:
        foreach (int Map in maps) {}
    } 
}

不要那样做;这很令人困惑。您的代码的读者应该能够合理地看到标识符“Map”,并且在它首次使用的块中具有相同的含义。

这里最好的选择是重命名本地。标准做法是将本地人命名为以小写字母开头。

答案 1 :(得分:2)

这是您在此代码中使用的不同类型的不同实例之间的命名冲突。我推测它是foreach stattement中的变量。只需将其重命名即可。

答案 2 :(得分:0)

您在示例中未看到的是顶部的using语句。你所拥有的是名称空间冲突。