2011-09-23 80 views
0

这里的查询语法版本:为什么这个简单的LINQ查询语法语句不能转换为方法语法?

DataGridViewRowCollection mydgvrs = new DataGridView().Rows; 

IEnumerable<DataGridViewRow> a = 
from DataGridViewRow row in mydgvrs 
where row.Height > 0 
select row; 

这是很好的,和方法的语法版本:

IEnumerable<DataGridViewRow> a2 = 
mydgvrs.Where(row => row.Height > 0); 

该编译器拒绝 - “没有扩展方法在哪里?可以找到”?

这是怎么回事?

回答

1

因为您具有在查询语法版本中指定的类型。 (DataGridViewRow from DataGridViewRow row)。

要翻译这一点,你需要一个Cast<T>

IEnumerable<DataGridViewRow> a2 = mydgvrs.Cast<DataGridViewRow>() 
             .Where(row => row.Height > 0); 

这是必需的,因为mydgvrs工具IEnumerable,但不IEnumerable<DataGridViewRow>

+0

谢谢里德,这工作。但我不明白为什么需要Enumerable.Cast 。当然,它会将DataGridViewRow对象转换为DataGridViewRow,即不改变类型。也就是说,它已经有了它需要的类型信息。如果你有时间,请善举解释一下。谢谢。 – ChrisJJ

+0

@ChrisJJ:mydgvrs可能是一个'DataGridViewRowCollection',它早于泛型。如果你看看文档,它实现了'IEnumerable',但是不是**'IEnumerable '。该方法只是将它看作一堆没有强制转换的'System.Object'实例。这就是为什么你的查询语法需要'从DataGridViewRow行'而不是'从行' - 通常,你不需要那里的类型说明。 –

+0

@ChrisJJ:参考这个类的文档:http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewrowcollection.aspx –

相关问题