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

如何修复error CS0021:无法对object类型表达式应用[]索引器?

修复error CS0021并实现DataRow删除需求

错误原因

error CS0021的本质是你遍历DataTable.Rows时,将行对象声明为了object类型——object没有索引器,自然无法通过row["TestDate"]访问字段值。

修复方案

方案一:修正遍历逻辑(直接操作DataRow)

将遍历的行类型明确为DataRow,同时倒序遍历(避免删除行后原集合索引错乱),再强转字段值进行判断:

DateTime targetDate = new DateTime(2019, 11, 1);

// 倒序遍历,防止删除行后索引偏移
for (int i = dt_test.Rows.Count - 1; i >= 0; i--)
{
    DataRow row = dt_test.Rows[i];
    // 先判断字段是否为空,避免转型报错
    if (row["TestDate"] != DBNull.Value)
    {
        DateTime testDate = (DateTime)row["TestDate"];
        if (testDate > targetDate)
        {
            dt_test.Rows.Remove(row);
        }
    }
}

方案二:正确使用LINQ实现

LINQ不能直接遍历原集合删除元素,需先将待删除行存入独立列表,再批量处理:

DateTime targetDate = new DateTime(2019, 11, 1);

// 筛选出所有符合条件的行,存入List避免遍历原集合时修改
var rowsToDelete = dt_test.AsEnumerable()
                          .Where(row => row.Field<DateTime>("TestDate") > targetDate)
                          .ToList();

// 批量删除
foreach (var row in rowsToDelete)
{
    row.Delete();
}
// 提交更改,让删除生效
dt_test.AcceptChanges();

额外注意事项

  • 如果TestDate字段允许为空,需用row.Field<DateTime?>("TestDate")处理可空类型,避免DBNull转换异常
  • 无论用哪种方式,都不要在正向遍历原Rows集合时直接删除行,会触发集合修改异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 13:10:04