我很想知道var关键字在DataGridViewSelectedRowCollection上的foreach循环中无法正常工作的原因。
EX1:
var selectedRows = MyDataGridView.SelectedRows;
foreach (var row in selectedRows)
{
var foo = row.DataBoundItem;
_bindingSource.Remove(foo);
}
ex1'行的类型'是对象。 为什么它不是类型' DataGridViewRow'
ex2完美运作:
var selectedRows = MyDataGridView.SelectedRows;
foreach (DataGridViewRow row in selectedRows)
{
var foo = row.DataBoundItem;
_bindingSource.Remove(foo);
}
如果我直接访问该集合的项目也可以:
var selectedRows = MyDataGridView.SelectedRows;
var foo = selectedRows[0];
var bar = foo.GetType().Name; // bar == DataGridViewRow
我对发生这种情况的原因感兴趣。
提前致谢
答案 0 :(得分:2)
DataGridView.SelectedRows Property返回DataGridViewSelectedRowCollection。 DataGridViewSelectedRowCollection类的类型声明是:
public class DataGridViewSelectedRowCollection : BaseCollection,
IList, ICollection, IEnumerable
请注意,该类实现IEnumerable
,但不实现IEnumerable<DataGridViewRow>
。作为foreach
循环项返回的IEnumerator.Current Property属于System.Object
类型。因此,IDE /编译器正在为var row
分配一个对象类型,从技术上讲,类型推断正在按指定的方式工作。
var foo = selectedRows[0];
的作用的原因是,C#索引器返回的DataGridViewSelectedRowCollection.Item Property被输入为DataGridViewRow,因此类型推断会选择它。