请原谅我,如果这是重复的,但这对我来说是一个小问题,我只能花很长时间在我的好奇心上。为什么当我在一个foreach块中使用隐式类型循环变量时,我没有得到任何Intellisense?推断的类型似乎很明显。为什么C#中的'foreach'语句中没有'var'变量的智能感知?
我正在使用ReSharper,但是当我将智能感知切换到VS时,我得到了相同的行为,这并不认为这是责任。
编辑:对不起,稍后,但我正在迭代DataTable.Rows,它使用一个无类型的ieterator,如马克下面解释。
请原谅我,如果这是重复的,但这对我来说是一个小问题,我只能花很长时间在我的好奇心上。为什么当我在一个foreach块中使用隐式类型循环变量时,我没有得到任何Intellisense?推断的类型似乎很明显。为什么C#中的'foreach'语句中没有'var'变量的智能感知?
我正在使用ReSharper,但是当我将智能感知切换到VS时,我得到了相同的行为,这并不认为这是责任。
编辑:对不起,稍后,但我正在迭代DataTable.Rows,它使用一个无类型的ieterator,如马克下面解释。
我怀疑你列举的数据不类型 - 例如的写在1.1事情很多只实现IEnumerable
,不具有自定义迭代器(你实际上并不需要IEnumerable<T>
做类型迭代 - 事实上你甚至不需要使用IEnumerable
来使用foreach
;很多1.1类型写了特殊的枚举类型以避免装箱/投射等 - 很多工作)。在很多情况下,修复它们将是一个突破性的改变。
一个简单的例子这里是PropertyDescriptorCollection
:
var props = TypeDescriptor.GetProperties(obj);
foreach(PropertyDescriptor prop in props) {...} // fine
但实际上,PropertDescriptorCollection
的枚举只是IEnumerator
,所以Current
是object
- ,因此您总能获得object
当您使用var
:
var props = TypeDescriptor.GetProperties(obj);
foreach(var prop in props) {...} // prop is "object"
与此对比(等于1.1)StringCollection
;这有一个自定义的枚举器(StringEnumerator
);所以如果你使用foreach
和var
,你会得到string
(不是object
)。
在任何2.0及以上,这将是有理由期待更好的打字,有两个原因:
但即使如此,仍然有这样的情况,当你没有得到你期望的类型;您可以(也可以更清楚地)手动指定类型,或使用Cast<T>()
/OfType<T>()
。
这发生在我身上很多。铸
@Stuart B - 确实; “手动指定类型”也涉及较少的间接性,因此*边际*更快更清晰。 – 2009-11-08 22:20:22
发布代码,它通常适用于我。 – Lazarus 2009-11-08 09:49:36
使用VS,它可以在我的机器上工作......无论如何,这是一个编程问题? – Joren 2009-11-08 09:54:28
我的怀疑是这个集合是Object类型的,这会给Intellisense的数量最少......除此之外,var总是适用于我的foreach – 2009-11-08 09:58:06