You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中C#如何正确声明固定长度的List数组变量?

Unity固定长度List数组的简洁初始化方案

报错原因说明

你写的public List<GameObject>[] charactersOnBoardSortedP1 = new List<GameObject>[5];仅初始化了数组本身,List<GameObject>属于引用类型,数组创建后每个元素默认值为null,直接访问就会抛出Object reference not set to an instance of an object空引用错误。

简洁写法推荐

1. LINQ一行式写法(最简洁)

首先引入命名空间:

using System.Linq;

声明字段时直接写,长度可以自由修改,哪怕是100也只需要改数字参数:

public List<GameObject>[] charactersOnBoardSortedP1 = Enumerable.Range(0, 5)
    .Select(_ => new List<GameObject>())
    .ToArray();

注意:不要误用Enumerable.Repeat(new List<GameObject>(), 5).ToArray(),该写法会让所有数组元素指向同一个List实例,修改其中一个元素会同步影响其他所有元素。

2. 通用封装方法(无LINQ依赖、性能更优)

如果项目不想依赖LINQ,可以封装一个通用初始化方法,一次编写多处调用:

// 可以放到项目的通用工具类中
public static T[] InitRefTypeArray<T>(int length) where T : new()
{
    T[] result = new T[length];
    for (int i = 0; i < length; i++)
    {
        result[i] = new T();
    }
    return result;
}

调用时只需要指定类型和长度即可:

// 初始化长度为5的List数组
public List<GameObject>[] charactersOnBoardSortedP1 = InitRefTypeArray<List<GameObject>>(5);
// 初始化长度为100的List数组也只需要改参数
public List<GameObject>[] testArray = InitRefTypeArray<List<GameObject>>(100);

Unity场景下的补充说明

如果是MonoBehaviour脚本中的字段,也可以选择在Awake/Start生命周期中执行初始化逻辑,写法和上面一致。

内容的提问来源于stack exchange,提问作者Jim Hopper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:45:05