重载索引器会导致:“Minesweeper.Tile是一个类型但是像变量一样使用”错误

时间:2013-04-24 19:17:13

标签: c# indexing operator-overloading

我正在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);

然后

Tile [new Coords(0,0)]

我收到错误,我在类中使用Tile []的地方也遇到错误(constructor和calculateAdjacents)这里出了什么问题?

谢谢, 杰米

编辑:对不起我的意思是Tile [位置]我正在改变它并输入错误。问题是我重载了这应该意味着即使从另一个类调用Tile [coords]也是合法的

1 个答案:

答案 0 :(得分:2)

目前尚不清楚您的期望是什么意思:

Tile[this];

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

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

Tile tile = this[someCoordinate];

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

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

然后你只需在其他地方拨打Tile.GetTile(...)

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