2009-11-08 56 views
3

请原谅我,如果这是重复的,但这对我来说是一个小问题,我只能花很长时间在我的好奇心上。为什么当我在一个foreach块中使用隐式类型循环变量时,我没有得到任何Intellisense?推断的类型似乎很明显。为什么C#中的'foreach'语句中没有'var'变量的智能感知?

我正在使用ReSharper,但是当我将智能感知切换到VS时,我得到了相同的行为,这并不认为这是责任。

编辑:对不起,稍后,但我正在迭代DataTable.Rows,它使用一个无类型的ieterator,如马克下面解释。

+5

发布代码,它通常适用于我。 – Lazarus 2009-11-08 09:49:36

+0

使用VS,它可以在我的机器上工作......无论如何,这是一个编程问题? – Joren 2009-11-08 09:54:28

+5

我的怀疑是这个集合是Object类型的,这会给Intellisense的数量最少......除此之外,var总是适用于我的foreach – 2009-11-08 09:58:06

回答

7

我怀疑你列举的数据不类型 - 例如的写在1.1事情很多只实现IEnumerable,不具有自定义迭代器(你实际上并不需要IEnumerable<T>做类型迭代 - 事实上你甚至不需要使用IEnumerable来使用foreach;很多1.1类型写了特殊的枚举类型以避免装箱/投射等 - 很多工作)。在很多情况下,修复它们将是一个突破性的改变。

一个简单的例子这里是PropertyDescriptorCollection

var props = TypeDescriptor.GetProperties(obj); 
foreach(PropertyDescriptor prop in props) {...} // fine 

但实际上,PropertDescriptorCollection的枚举只是IEnumerator,所以Currentobject - ,因此您总能获得object当您使用var

var props = TypeDescriptor.GetProperties(obj); 
foreach(var prop in props) {...} // prop is "object" 

与此对比(等于1.1)StringCollection;这有一个自定义的枚举器(StringEnumerator);所以如果你使用foreachvar,你会得到string(不是object)。

在任何2.0及以上,这将是有理由期待更好的打字,有两个原因:

  • 仿制药(用于简单的情况下),从而能够写出强类型集合理智
  • 迭代器块(用于非平凡的情况),使得有可能编写自定义迭代器而不会发疯

但即使如此,仍然有这样的情况,当你没有得到你期望的类型;您可以(也可以更清楚地)手动指定类型,或使用Cast<T>()/OfType<T>()

+0

这发生在我身上很多。铸()的作品,但我发现它更清楚,只是不使用VAR在这种情况下。 – 2009-11-08 21:14:23

+0

@Stuart B - 确实; “手动指定类型”也涉及较少的间接性,因此*边际*更快更清晰。 – 2009-11-08 22:20:22