为什么var不适用于DataGridViewSelectedRowCollectoin

时间:2017-08-03 08:18:31

标签: c# winforms collections var

我很想知道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

我对发生这种情况的原因感兴趣。

提前致谢

1 个答案:

答案 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,因此类型推断会选择它。