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

这不起作用。

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

但这样做。

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

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

它是否与DataGridViewRowCollection实现非通用IEnumerable但不是通用版本IEnumerable的事实有关? 或者它显然在内部使用ArrayList ? 它并没有给我带来任何实际问题,但我想更好地理解它。

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

但是,有一种更简单的方法可以调用Cast – 只需显式键入范围变量:

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

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