【问题标题】:Why does my var call not return DataListItems为什么我的 var 调用不返回 DataListItems
【发布时间】:2012-09-19 00:44:50
【问题描述】:

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

var daysWorked = dlResourcesAllocated.Items;

然后单步执行它返回的列表

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# 时应该更加注意......

【问题讨论】:

  • 如果你这样做 var daysWorked = dlResourcesAllocated.Items.Cast<DataListItem>() 它会工作,因为它会返回一个通用集合。

标签: c# asp.net .net


【解决方案1】:

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

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

这样写:

foreach (var d in daysWorked)

编译器看到daysWorked实现了IEnumerable,并将其重写为:

foreach (object d in daysWorked)

当使用foreachIEnumerable(非泛型)时,您可以显式提供类型:

foreach (DataListItem d in daysWorked)

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

【讨论】:

  • 或者,您可以使用foreach(var d in daysWorked.Cast<DataListItem>()),但这有点恶心。
  • @JonSkeet True - 但这实际上是通过另一种方法运行它。
  • @JonSkeet 哦,嘿伙计。我只是重读了我的问题。我的意思是,我喜欢你的书,它真的很擅长解释这种东西。
  • @ReedCopsey 谢谢老兄,这解释得很好。
  • @MikeyMouse: :) 事实上我不认为它确实解释了varforeach 循环的作用...有一次值得一看而是按照规范!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    似乎Item 属性返回并且IEnumerable,而不是IEnumerable<DataListItem>,这意味着枚举中的项目是object 类型。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      相关资源
      最近更新 更多