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

为什么DataGridView.Rows与SelectedRows无法在三元运算符中混用?

问题原因

三元运算符对返回类型有严格要求:它的两个分支必须返回相同类型,或者其中一个类型可以隐式转换为另一个类型,否则编译器无法推断整个三元表达式的最终类型,就会抛出编译错误。

你遇到的问题根源就在于:

  • dataGridView1.Rows 的类型是 DataGridViewRowCollection
  • dataGridView1.SelectedRows 的类型是 DataGridViewSelectedRowCollection

这两个是完全独立的类,既没有继承自同一个泛型集合父类,也没有定义互相的隐式转换规则,所以三元运算符无法把两个不同类型的返回值合并成统一类型,自然就报错了。

至于为什么两个集合单独放在foreach里都能正常用DataGridViewRow迭代,是因为这两个集合都实现了非泛型的IEnumerable接口,内部的枚举器返回的元素都是DataGridViewRow类型,foreach可以自动处理元素的类型转换,但这个特性不影响集合本身的类型差异。

解决方案

你可以用LINQ的Cast<T>()扩展方法,把两个集合统一显式转换为IEnumerable<DataGridViewRow>类型,就能正常合并了:

// 注意你原代码里的dataGridView2属于笔误,这里修正为dataGridView1
foreach (DataGridViewRow row in allrows 
    ? dataGridView1.Rows.Cast<DataGridViewRow>() 
    : dataGridView1.SelectedRows.Cast<DataGridViewRow>())
{
    // 统一处理逻辑
}

也可以提前声明变量接收集合,逻辑更清晰:

IEnumerable<DataGridViewRow> targetRows = allrows 
    ? dataGridView1.Rows.Cast<DataGridViewRow>() 
    : dataGridView1.SelectedRows.Cast<DataGridViewRow>();

foreach (DataGridViewRow row in targetRows)
{
    // 处理逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:27:00