0

我在 c# 中制作一个扫雷项目是为了好玩,我想将新的 Tiles 存储在 Tile 类内的字典中,以便在启动 Tile 时将其存储并可以通过 Tile[coords] 访问但是我不断得到上面错误。这是我用于 Tile 类的代码(请不要评论我的约定,我是 C# 新手,我是 Java/Python 程序员:p)

class Tile
{
    private static Dictionary <Coords, Tile> tiles = new Dictionary <Coords, Tile> ();

    public int numMinesAdjacents { get; set; }
    public readonly bool isMine;
    public readonly Coords position;

    private Tile [] aAdjacents = new Tile [8];

    public Tile(int x, int y, bool isMine = false)
    {
        this.isMine = isMine;
        position = new Coords(x, y);
        Tile[position] = this;
    }

    public void init()
    {
        calculateAdjacents();
        calculateNumMinesAdjacent();
    }

    private void calculateAdjacents()
    {
        int i = 0;
        for (int y = -1; y < 1; y++)
        {
            if ((position.y - y) < 0 || (position.y + y) > Math.Sqrt(Program.MAX_TILES)) continue;
            for (int x = -1; x < 1; x++)
            {
                if ((position.x - x) < 0 || (position.x + x) > Math.Sqrt(Program.MAX_TILES)) continue;
                aAdjacents [i] = Tile[position + new Coords(x, y)];
                i++;
            }
        }
    }

    private void calculateNumMinesAdjacent()
    {
        int n = 0;
        foreach (Tile pTile in aAdjacents)
        {
            if (pTile.isMine) n++;
        }
        numMinesAdjacents = n;
    }

    /*private static void add(Tile pTile)
    {
        tiles.Add(pTile.position, pTile);
    }*/

    public /*static - if I use static nothing is different*/ Tile this [Coords coords]
    {
        get { return tiles [coords]; }
    }
}

如果我打电话

平铺(0, 0); 平铺(0, 1);

接着

平铺[新坐标(0, 0)]

我得到一个错误,我在使用 Tile[] 的类中的位置(构造函数和 calculateAdjacents)也得到一个错误这里出了什么问题?

谢谢,杰米

编辑:对不起,我的意思是 Tile[position] 我把它改回来并打错了。问题是我重载了它,这应该意味着即使从另一个类调用 Tile[coords] 也是合法的

4

1 回答 1

2

目前尚不清楚您期望这意味着什么:

Tile[this];

不过,目前这不是一个有效的表达方式。

C# 不支持静态索引器。对于实例索引器,您可以使用:

Tile tile = this[someCoordinate];

...虽然实例索引器使用这样的静态成员很奇怪。有一个方法会更干净:

public static Tile GetTile(Coords coords)
{
    return tiles[coords];
}

然后你就打电话Tile.GetTile(...)到别处了。

作为旁注,您应该开始遵循 .NET 命名约定以使您的代码更易于理解。另外,我强烈建议您避免使用公共字段,即使它们是只读的。

于 2013-04-24T19:19:19.400 回答