ToArray是List的实例方法,需确保对象为泛型List类型;它安全返回新数组(含空列表),但仅浅拷贝,不适用于遍历或深拷贝场景。

ToArray 方法能直接转,但要注意泛型约束
ToArray 是 List<t></t> 的实例方法,不是静态工具,调用前必须确保对象是泛型 List<t></t> 类型。非泛型 ArrayList 或 IEnumerable(未确定具体实现)不能直接用——会编译报错 'IEnumerable' does not contain a definition for 'ToArray'。
常见错误:从 LINQ 查询(如 Where)拿到 IEnumerable<t></t> 后直接点 .ToArray(),其实没问题;但如果变量声明为裸 IEnumerable(没写泛型参数),就会失败。
- ✅ 正确:
var list = new List<string> { "a", "b" }; string[] arr = list.ToArray();</string> - ❌ 错误:
IEnumerable list = new List<string>(); list.ToArray();</string>(缺少泛型,编译不过) - ⚠️ 注意:
Array.ConvertAll适合需要转换元素类型的场景,ToArray不做类型映射
空 List 调用 ToArray 安全,返回空数组
不用提前判空——ToArray 对空 List<t></t> 返回长度为 0 的 T[],不会抛异常,也不返回 null。这点比手写循环 + new T[n] 更省心。
但要注意:如果后续代码把返回值当成可变数组并做了 Array.Resize,那和原 List 就完全无关了,改的是副本。
- ✅ 安全:
var empty = new List<int>(); int[] a = empty.ToArray(); // a.Length == 0</int> - ⚠️ 坑点:
ToArray总是分配新数组,原List修改不影响已生成的数组,反之亦然 - ? 场景提示:向只接受
T[]的老 API(如某些 Win32 P/Invoke)传参时,这是最简路径
性能差异:ToArray 比手动 new + CopyTo 略慢但可忽略
ToArray 内部也是先 new T[list.Count] 再 Array.Copy,多了一次 Count 属性访问和边界检查,实测百万级元素差异在纳秒级。除非在极严苛的热路径(比如每帧调用上万次),否则别为了这点开销绕开它。
真正影响性能的是隐式装箱或重复调用——比如在循环里对同一个 List<int></int> 反复调 ToArray,不如缓存结果。
- ✅ 推荐:
var arr = myList.ToArray(); // 一次分配,清晰明确 - ❌ 过度优化:
var arr = new int[myList.Count]; myList.CopyTo(arr);(多写、易错、无实质收益) - ⚠️ 兼容性:.NET Framework 2.0+ 和所有 .NET Core/.NET 5+ 都支持,无版本陷阱
替代方案:什么时候不该用 ToArray
如果只是想“遍历”,根本不需要转数组——List<t></t> 本身实现了 IEnumerable<t></t>,foreach、LINQ 方法都能直接用。强行转数组反而多一次内存分配。
另一个典型误用:把 ToArray 当作“深拷贝”手段。它只做浅拷贝,引用类型元素的引用被复制,对象本身没变。
- ✅ 应该用:
SomeNativeApi.ExpectStringArray(names.ToList().ToArray()); - ❌ 不该用:
foreach (var item in list.ToArray()) { ... }(直接foreach (var item in list)更好) - ⚠️ 复杂点:若元素是可变引用类型(如
class Person),且你希望数组里的对象也独立于原 List 中的实例,ToArray做不到——得手动 new + 属性复制


















