如何在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
相关产品推荐
相关产品推荐

