为什么我必须在DataGridViewRow上调用Cast <>扩展方法?

Joh*_*ant 1 .net c# linq datagridview winforms

这不起作用.

var result = 
    from row in grid.Rows
    where (string) row.Cells["COLUMN_1"].Value == "Test"
    select row.Cells["COLUMN_2"].Value as int?;
Run Code Online (Sandbox Code Playgroud)

但这样做.

var result = 
    from row in grid.Rows.Cast<DataGridViewRow>()
    where (string) row.Cells["COLUMN_1"].Value == "Test"
    select row.Cells["COLUMN_2"].Value as int?;
Run Code Online (Sandbox Code Playgroud)

据我所知,DataGridViewRowCollection是DataGridViewRows的集合.那么为什么我必须先将每个成员转换为DataGridViewRow才能访问其属性?

它与DataGridViewRowCollection实现非泛型IEnumerable但非泛型版本的事实有什么关系IEnumerable<DataGridViewRow>吗?或者它显然在ArrayList内部使用?它并没有给我带来任何实际问题,但我想更好地理解它.

Jon*_*eet 6

是的,这正是因为它所宣传的界面.几乎LINQ中的所有扩展方法都在工作IEnumerable<T>而不是IEnumerable.Cast<>是弥合这一差距的一种方式 - OfType<>是另一种方式.

但是,有一种更简单的调用方式Cast<T>- 只需显式键入范围变量:

var result = 
    from DataGridViewRow row in grid.Rows
    where (string) row.Cells["COLUMN_1"].Value == "Test"
    select row.Cells["COLUMN_2"].Value as int?;
Run Code Online (Sandbox Code Playgroud)

编译器将其转换为与第二个示例完全相同的代码.