为什么DataGridView.Rows与SelectedRows无法在三元运算符中混用?
问题原因
三元运算符对返回类型有严格要求:它的两个分支必须返回相同类型,或者其中一个类型可以隐式转换为另一个类型,否则编译器无法推断整个三元表达式的最终类型,就会抛出编译错误。
你遇到的问题根源就在于:
dataGridView1.Rows的类型是DataGridViewRowCollectiondataGridView1.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
相关产品推荐
相关产品推荐

