0

我是 C# 的初学者,我不断收到“System.NullReferenceException”错误。我到处寻找,但似乎找不到有用的解决方案。我简化了下面的代码,以便更清楚。

namespace tile_test
{
    public class Game1 : Game
    {
        public static float bottomWorld = 38400f;
        public static float rightWorld = 134400f;
        public static int maxTilesX = (int)rightWorld / 16 + 1;
        public static int maxTilesY = (int)bottomWorld / 16 + 1;


        public Game1()
        {
            Tile[,] tile = new Tile[maxTilesX, maxTilesY];
            int x = 1;
            int y = 1;
            tile[x, y].active = false; //Error on this line.
        }
    }
}

Tile 类如下所示

namespace tile_test
{
    public class Tile
    {
        public bool active;
    }
}

谁能帮帮我?

4

3 回答 3

2

您已经声明了一个数组来存储所需尺寸的 Tile 对象,但是该数组的每个插槽都是 NULL,您不能引用 NULL 尝试分配属性 active

Tile[,] tile = new Tile[maxTilesX, maxTilesY];
int x = 1;
int y = 1;
tile[x, y] = new Tile() {active=false};

并且您计划存储在数组中的每个 Tile 都需要这样的代码

于 2013-05-19T17:51:57.853 回答
2

首先初始化tile[x, y]

tile[x, y] = new Tile();
tile[x, y].active = false;

要初始化数组的所有元素,您可以创建一个实用方法

 T[,] Create2DimArray<T>(int len1,int len2) where T: new()
    {
        T[,] arr = new T[len1, len2];
        for (int i = 0; i < len1; i++)
        {
            for (int j = 0; j < len2; j++)
            {
                arr[i, j] = new T();
            }
        }
        return arr;
    }

并将其用作

Tile[,] tile = Create2DimArray<Tile>(maxTilesX, maxTilesY);
于 2013-05-19T17:52:10.790 回答
0

System.NullReferenceException当您尝试执行不存在的对象(值为 )的操作时会抛出A null- 在这种情况下,您在数组中位置 1,1 的 Tile 尚不存在,因此数组存储该值null代替适当的参考。

您需要先实例化 Tiles 数组中的所有项目,然后再尝试使用它们。当您创建数组时,它们都具有默认null值,因为堆上还没有要引用的对象。

如果您想一次创建所有图块,只需在创建数组后完成此操作:

for (int i = 0; i < maxTilesX; i++)
{ // loop through "rows" of tiles
    for (int j = 0; j < maxTilesY; j++)
    { // loop through corresponding "column" of tiles
        tile[i, j] = new Tile(); // create a Tile for the array to reference
        tile[i, j].active = false; // some initialization
    }
}

正如您所知,C# 使用零索引数组,因此数组中的第一项实际上是tile[0, 0]:如果您想阅读更多信息,请参阅MSDN C# 数组教程中的有关数组的更多信息。对不起,如果你已经知道了!

于 2013-05-19T17:59:28.097 回答