为什么';var';'中的变量;foreach&x27;C#中的语句?

为什么';var';'中的变量;foreach&x27;C#中的语句?,c#,.net,C#,.net,如果这是重复的,请原谅我,但这对我来说是个小问题,我只能在好奇心上花这么长时间。为什么在foreach块中使用隐式类型的循环变量时,没有Intellisense?推断出的类型似乎很明显 我正在使用ReSharper,但是当我将Intellisense切换到VS时,我得到了相同的行为,这不认为是错误的 编辑:很抱歉,稍晚一点,但我正在迭代DataTable.Rows,它使用非类型化的ieterator,正如Marc在下面解释的那样。我怀疑您正在枚举的数据没有类型化-例如,在1.1中编写的很多东西只

如果这是重复的,请原谅我,但这对我来说是个小问题,我只能在好奇心上花这么长时间。为什么在foreach块中使用隐式类型的循环变量时,没有Intellisense?推断出的类型似乎很明显

我正在使用ReSharper,但是当我将Intellisense切换到VS时,我得到了相同的行为,这不认为是错误的


编辑:很抱歉,稍晚一点,但我正在迭代DataTable.Rows,它使用非类型化的ieterator,正如Marc在下面解释的那样。

我怀疑您正在枚举的数据没有类型化-例如,在1.1中编写的很多东西只实现了
IEnumerable
,并且没有自定义的迭代器(实际上,你不需要
IEnumerable
来进行类型化迭代——事实上,你甚至不需要
IEnumerable
来使用
foreach
;很多1.1类型的用户编写了特殊的枚举器类型来避免装箱/强制转换等——这需要大量的工作)。在许多情况下,修复它们是一个突破性的改变

这里的一个简单示例是
PropertyDescriptorCollection

var props = TypeDescriptor.GetProperties(obj);
foreach(PropertyDescriptor prop in props) {...} // fine
但实际上,
PropertDescriptorCollection
的枚举器只是
IEnumerator
,所以
Current
object
,因此当您使用
var
时,总是会得到
object

var props = TypeDescriptor.GetProperties(obj);
foreach(var prop in props) {...} // prop is "object"
将其与(同样为1.1)的
StringCollection
;它有一个自定义枚举器(
StringEnumerator
);因此,如果将
foreach
var
一起使用,则会得到
string
(而不是
对象

在2.0及以上版本中,出于两个原因,期望更好的键入是合理的:

  • 泛型(对于简单的情况),使编写强类型集合成为可能
  • 迭代器块(对于非平凡的情况),使编写自定义迭代器成为可能而不会发疯

但即使如此,仍然有一些情况下无法获得所需的类型;您可以手动(也许更清楚地)指定类型,或者使用type()的
Cast()
/

发布代码,它通常对我有效。使用VS,它在我的机器上有效…这到底是一个编程问题吗?我怀疑集合是Object类型的,这将提供最少的智能感知…除此之外,var总是在ForEach中对我有效使用Resharper或VS从未遇到过这个问题。什么版本关于Resharper?VS的哪个版本?容器是什么?(它是IEnumerable还是IEnumerable)?@Joren,这与我使用的主要编程工具直接相关,我怀疑这里的许多其他工具也是如此。这种情况在我身上经常发生。Cast()可以工作,但我发现在这种情况下不使用var更清楚。@Stuart B-的确;the“手动指定类型”涉及的间接操作也较少,因此速度略快且更清晰。