C#中Array.Select后拼接数组的报错解决求助
数组拼接方法的类型推断与参数转换问题
原始代码与初始错误
我在大学项目中写了以下代码,目的是遍历每个Ronde类型的rs,调用其collapse()方法(返回Order[]),然后把所有返回的数组合并成一个Order[]:
public Order[] collapse() { return ConcatArrays(Rondes.Select(rs => rs.collapse())); } public static T[] ConcatArrays<T>(T[][] list) { var result = new T[list.Sum(a => a.Length)]; int offset = 0; for (int x = 0; x < list.Length; x++) { list[x].CopyTo(result, offset); offset += list[x].Length; } return result; }
运行时遇到错误:
无法从用法中推断方法 ConcatArrays
(T[][]) 的类型参数。请尝试显式指定类型参数。
我尝试把所有T替换成Order,错误依然存在。
编辑后的代码与新错误
我修改了第一个方法:
public Order[] collapse() { if (Rondes == null) { return new Order[0]; } return OrderLijsten.ConcatArrays<Order>(Rondes.Select(rs => rs.collapse())); }
现在出现新错误:
Error CS1503 参数 1: 无法从“System.Collections.Generic.IEnumerable<Grote_Opdracht.Classes.Order[]>”转换为“Grote_Opdracht.Classes.Order[][]”
解决方案
方案1:将Select结果转为数组
问题核心是Rondes.Select(...)返回的是IEnumerable<Order[]>枚举序列,而ConcatArrays方法要求的参数是T[][]二维数组,两者类型不兼容,导致类型推断失败、参数转换错误。
只需要在Select后调用ToArray(),把枚举序列转换成二维数组,就能匹配方法参数:
public Order[] collapse() { if (Rondes == null) { return new Order[0]; } // 显式指定泛型类型,同时转成二维数组 return OrderLijsten.ConcatArrays<Order>(Rondes.Select(rs => rs.collapse()).ToArray()); }
或者因为已经转成Order[][],编译器可以自动推断泛型类型,简化为:
public Order[] collapse() { if (Rondes == null) { return new Order[0]; } return OrderLijsten.ConcatArrays(Rondes.Select(rs => rs.collapse()).ToArray()); }
方案2:修改ConcatArrays的参数类型(更推荐)
如果希望方法更灵活,支持直接传入枚举序列而不需要手动转数组,可以修改ConcatArrays的参数为IEnumerable<T[]>,同时调整内部循环为foreach(更适配枚举类型):
public static T[] ConcatArrays<T>(IEnumerable<T[]> list) { var result = new T[list.Sum(a => a.Length)]; int offset = 0; foreach (var array in list) { array.CopyTo(result, offset); offset += array.Length; } return result; }
此时调用时无需额外转换,直接传入Select的结果即可,类型推断也能正常工作:
public Order[] collapse() { if (Rondes == null) { return new Order[0]; } return OrderLijsten.ConcatArrays(Rondes.Select(rs => rs.collapse())); }
内容的提问来源于stack exchange,提问作者Jord van Eldik
相关产品推荐
相关产品推荐

