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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:50:28