3

自从获得 Resharper 以来,我一直喜欢尽可能使用 var inside 方法。因此,稍后如果您传入不同的类型,则更改会在您的代码中向下级联,而无需将每个 int 声明更改为双精度。这让我想到了我的问题。我正在从 DataList 中检索 DataListItems 列表

var daysWorked = dlResourcesAllocated.Items;

然后单步执行它返回的 List

foreach (var d in daysWorked)
{
     var c = d.FindControl("ucSomethingSomething"); //Doesn't compile d has no methods
}

我的 d 突然被转换为一个没有方法的对象

foreach (DataListItem d in daysWorked)
{
     var c = d.FindControl("ucSomethingSomething");
}

但是工作得很好。

我只是好奇为什么“var”无法弄清楚它是DataListItem的集合。Intellisense 似乎知道这一点。我确信对此有一个非常简单的解释。飞碟老兄可能会出现并指出我在深入阅读 C# 时应该更加注意......

4

3 回答 3

9

这是因为DataListItemCollection只有实现IEnumerable,而不是IEnumerable<DataListItem>,因为它早于泛型。

由于它没有实现,除非您明确提供类型,否则IEnumerable<T>运行时将Object在您的foreach循环中使用。

通过这样写:

foreach (var d in daysWorked)

编译器看到daysWorkedimplements IEnumerable,并将其重写为:

foreach (object d in daysWorked)

foreachIEnumerable(非泛型)一起使用时,您可以明确地提供类型:

foreach (DataListItem d in daysWorked)

这样做可以有效地IEnumerable为您转换结果,在循环中提供正确的类型。

于 2012-09-18T16:41:53.217 回答
1

这是因为DataList.Items返回一个DataListItemCollection,而不是 的通用集合DataListItem

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.datalistitemcollection.aspx

于 2012-09-18T16:42:13.060 回答
0

我强烈建议您仅var在类型很明显时才使用。如果你需要思考,你可能造成的伤害多于帮助。

看起来该Item属性返回IEnumerable,而不是IEnumerable<DataListItem>,这意味着枚举中的项目是类型的object

foreach (DataListItem d in daysWorked)实际上会导致从 to 中的每个项目返回的类型进行强制daysWorked转换DataListItem,这就是该代码正常工作的原因。

于 2012-09-18T16:44:50.220 回答