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

如何在C# .NET Core中正确实例化Array并解决索引赋值报错?

问题分析

报错CS0021的核心原因是:Array.CreateInstance返回的是非泛型Array类型,该类型不支持直接使用[]索引运算符进行赋值,必须通过它的SetValue方法来设置元素。


解决方案

方案1:基于非泛型Array修改赋值逻辑

不需要改动result的创建方式,仅替换赋值语句为SetValue方法即可:

var result = Array.CreateInstance(typeof(Array), dt.Columns.Count);

foreach (int c in Enumerable.Range(0, dt.Columns.Count))
{
    var valuesArray = Array.CreateInstance(typeof(float), dt.Rows.Count);

    for (int r = 0; r < dt.Rows.Count; r++)
    {
        DataRow row = dt.Rows[r];
        // 确保值可转换为float,否则会抛出类型转换异常
        valuesArray.SetValue(Convert.ToSingle(row[c]), r);
    }

    // 用SetValue替代[]索引赋值
    result.SetValue(valuesArray, c);
}

方案2:改用泛型数组(推荐)

泛型数组支持直接索引操作,代码更直观,还能避免非泛型类型的装箱拆箱开销:

// 外层数组对应DataTable的列,内层数组对应列的float值
float[][] result = new float[dt.Columns.Count][];

foreach (int c in Enumerable.Range(0, dt.Columns.Count))
{
    float[] valuesArray = new float[dt.Rows.Count];

    for (int r = 0; r < dt.Rows.Count; r++)
    {
        DataRow row = dt.Rows[r];
        // 处理DBNull场景,避免转换失败
        valuesArray[r] = row.IsNull(c) ? float.NaN : Convert.ToSingle(row[c]);
    }

    // 直接通过索引赋值
    result[c] = valuesArray;
}

额外注意事项

  • 必须确保DataTable中的列值可安全转换为float,若存在无法转换的类型,需添加额外的类型检查逻辑。
  • 若DataTable包含DBNull值,建议参考方案2的处理方式,避免抛出InvalidCastException。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 05:03:27