Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 为什么这个简单的LINQ查询语法语句不能转换为方法语法?_.net_C# 4.0 - Fatal编程技术网

.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:请参阅该类的文档:好的,我看到了-一个过时的接口。非常感谢。