数组实例化错误

Array Instantiation Error

我有两个类:

public class SubObject {
    public int id;
}

public class Object {
    public SubObject[] SubObjects;
}

我有一个数组:

public Object[] Objects;

当我尝试实例化这个数组时:

public void InstantiateArrays(int objectsSize, int subObjectsSize) {
    Objects = new Object[objectsSize];
    foreach (Object obj in Objects) {
        obj.SubObjects = new SubObject[subObjectsSize];
    }
}

我收到此错误:

An exception of type 'System.NullReferenceException' occurred in **** but was not handled in user code

Additional information: Object reference not set to an instance of an object.

这是无效的:

Objects = new Object[objectsSize];
foreach (Object obj in Objects) {

这是因为第一行将创建一个由 null 引用组成的数组,这是 C# 中 Object 引用的默认值。使用 foreach 不会让您覆盖引用。

您需要使用数组索引来设置数组元素:

for(int i = 0; i < this.Objects.Length; i++ ) {
    this.Objects[i] = new SubObject[ subObjectSize ];
}

请注意,使用 Object 通常不是一个好主意,因为它会强制您使用转换。如果您有分层对象层次结构,则在适当的情况下使用强类型或更好的类型:泛型。

这一行:

Objects = new Object[objectsSize];

你创建了一个数组。数组的 元素 被初始化为该类型的默认值。因为它是一个 objects 的数组,这个默认值是 null.

在循环中,您试图访问 null:

对象的字段 SubObjects
obj.SubObjects = new SubObject[objectsSize];

快速修复是使用 for 循环并在循环中实例化对象:

for (int i = 0; i < subObjectSize; i++)
{
    Objects[i] = new Object();
    Objects[i].SubObjects = new SubObject[subObjectsSize];
}

另请注意,将您的 class 之一命名为 Object 是一种不好的做法,因为这是对象层次结构根部的 class 的名称。