.net 为什么这个简单的LINQ查询语法语句不能转换为方法语法?
以下是查询语法版本:.net 为什么这个简单的LINQ查询语法语句不能转换为方法语法?,.net,c#-4.0,.net,C# 4.0,以下是查询语法版本: 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 =&g
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);
DataGridViewRowCollection mydgvrs=新建DataGridView().Rows;
IEnumerable a=
从mydgvrs中的DataGridViewRow行
其中row.Height>0
选择行;
这很好,方法语法版本:
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);
IEnumerable a2=
mydgvrs.Where(行=>行高度>0);
编译器拒绝了“在……可以找到的地方没有扩展方法”
怎么了?因为您在查询语法版本中指定了类型。(DataGridViewRow行的
中的DataGridViewRow
)
要翻译此内容,您需要进行Cast
:
IEnumerable a2=mydgvrs.Cast()
.其中(行=>行高度>0);
这是必需的,因为
mydgvrs
实现了IEnumerable
,但不是IEnumerable
,谢谢里德,这是可行的。但我不明白为什么需要Enumerable.Cast。当然,它正在将DataGridViewRow对象强制转换为DataGridViewRow,即不更改类型。也就是说,Where已经有了它需要的类型信息。如果你有时间,请解释一下。谢谢。@ChrisJJ:mydgvrs可能是一个DataGridViewRowCollection
,它早于泛型。如果查看文档,它实现的是IEnumerable
,而不是IEnumerable
。该方法只是将其视为一组没有强制转换的System.Object
实例。这就是为什么您的查询语法需要DataGridViewRow行中的,而不仅仅是行中的-通常情况下,您也不需要那里的类型规范。@ChrisJJ:请参阅该类的文档:好的,我看到了-一个过时的接口。非常感谢。