- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我是 C# 新手,对“var”的使用有疑问
当我使用下面的代码时一切正常
foreach(DataGridViewRow row in myGrid.Rows)
{
if (row.Cells[2].Value.ToString().Contains("51000"))
{
row.Cells[0].Value = "X";
}
}
但是当我将 DataGridViewRow
更改为 var
时,我得到了错误信息
'object' does not contain definition for 'Cells' and no extension method 'Cells' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)
最佳答案
myGrid.Rows
类型为 DataGridViewRowCollection
.
这个东西很老了,它的定义是这样的:
public class DataGridViewRowCollection : ICollection, IEnumerable, IList
你看到非通用接口(interface)了吗?此类可以实现 IList<DataGridViewRow>
然后 var
会起作用,但它是遗产。
IEnumerable
不传达有关项目类型的信息, GetEnumerator
函数在这里没有帮助,因为它返回一个 IEnumerator
,虽然它可以返回 IEnumerator<DataGridViewRow>
.
本质上,C# 编译器查找 GetEnumerator
返回具有 MoveNext
的对象的函数功能和一个Current
属性(显式实现时或 IEnumerable<T>
/IEnumerable
接口(interface))。这duck-typing方法是出于历史原因,它在泛型被引入语言之前就存在了。 foreach
循环变量的类型与 Current
相同属性(property)。在 IEnumerator
内(非通用变体), Current
类型为 object
.
明确指定类型:
foreach (DataGridViewRow row in myGrid.Rows)
简单地转换Current
的返回值到 DataGridViewRow
, 因为缺乏更好的机制。
如果您真的想使用 var
,您也可以使用 LINQ 来达到同样的效果。关键字在这里:
foreach (var row in myGrid.Rows.Cast<DataGridViewRow>())
这行得通,因为 Enumerable.Cast<T>
扩展方法 返回 IEnumerable<T>
,这又利用了 IEnumerator<T>
, 和 T
最终成为 Current
的类型枚举器的属性,因此传播类型信息。
我怀疑您此时是否会从这些细节中受益,但您可能希望保留这些细节,以便在您了解有关该语言的更多信息时进一步引用。您必须了解扩展方法和泛型类型才能掌握这一点。
关于c# - var 不适用于 DataGridViewRow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29659434/
我是一名优秀的程序员,十分优秀!