我有两个班级:
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];
}
}
我收到此错误:
发生了'System.NullReferenceException'类型的异常 ****但未在用户代码中处理
附加信息:未将对象引用设置为对象的实例。
答案 0 :(得分:1)
这是无效的:
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
通常是一个坏主意,因为它会强制您使用强制转换。如果你有一个分层对象hiearchy然后使用强类型或更好:适当的泛型。
答案 1 :(得分:1)
在这一行:
Objects = new Object[objectsSize];
您创建一个数组。数组的元素被初始化为类型的默认值。由于它是对象的数组,因此默认值为null
。
在循环中,您尝试访问SubObjects
对象的字段null
:
obj.SubObjects = new SubObject[objectsSize];
快速解决方法是使用for
循环并实例化循环中的对象:
for (int i = 0; i < subObjectSize; i++)
{
Objects[i] = new Object();
Objects[i].SubObjects = new SubObject[subObjectsSize];
}
另请注意,命名其中一个类Object
是不好的做法,因为这是对象层次结构的类的名称。