gpt4 book ai didi

c# - var 不适用于 DataGridViewRow

转载 作者:IT王子 更新时间:2023-10-29 04:37:01 31 4
gpt4 key购买 nike

我是 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com