自从获得Resharper以来,我一直是使用var inside方法的粉丝.所以稍后如果你传入一个不同的类型,则更改会在代码中向下级联,而不必将每个int声明更改为double.这让我想到了我的问题.我正在从DataList中检索DataListItems列表
var daysWorked = dlResourcesAllocated.Items;
Run Code Online (Sandbox Code Playgroud)
然后单步执行List返回
foreach (var d in daysWorked)
{
var c = d.FindControl("ucSomethingSomething"); //Doesn't compile d has no methods
}
Run Code Online (Sandbox Code Playgroud)
我的d突然被投射到一个没有方法的物体上
foreach (DataListItem d in daysWorked)
{
var c = d.FindControl("ucSomethingSomething");
}
Run Code Online (Sandbox Code Playgroud)
但工作得很好.
我只是好奇为什么"var"无法弄清楚它是DataListItem的集合.Intellisense似乎知道它.我确信有一个非常简单的单线解释.双向调料师可能会出现并指出我在深入阅读C#时应该给予更多的关注......
这是因为它DataListItemCollection只是实现IEnumerable,而不是IEnumerable<DataListItem>因为它早于泛型.
由于它没有实现IEnumerable<T>,因此运行时Object在foreach循环中使用,除非您明确提供类型.
写这个:
foreach (var d in daysWorked)
Run Code Online (Sandbox Code Playgroud)
编译器看到该daysWorked实现IEnumerable,并将其重写为:
foreach (object d in daysWorked)
Run Code Online (Sandbox Code Playgroud)
使用时foreach用IEnumerable(非通用),你被允许提供明确的类型:
foreach (DataListItem d in daysWorked)
Run Code Online (Sandbox Code Playgroud)
这样做可以有效地IEnumerable为您提供结果,在循环中提供正确的类型.
| 归档时间: |
|
| 查看次数: |
130 次 |
| 最近记录: |