当前位置 : 主页 > 编程语言 > c语言 >

为什么在C#的’foreach’语句中没有’var’变量的Intellisense?

来源:互联网 收集:自由互联 发布时间:2021-06-25
如果这是重复的话请原谅我,但对我来说这是一个小问题,我只能花很长时间才能好奇.为什么当我在foreach块中使用隐式类型的循环变量时,我没有得到Intellisense?推断类型似乎非常明显.
如果这是重复的话请原谅我,但对我来说这是一个小问题,我只能花很长时间才能好奇.为什么当我在foreach块中使用隐式类型的循环变量时,我没有得到Intellisense?推断类型似乎非常明显.

我正在使用ReSharper,但是当我将Intellisense切换到VS时,我得到了相同的行为,这并不认为这是罪魁祸首.

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

我怀疑你枚举的数据没有输入 – 例如,很多用1.1编写的东西只实现IEnumerable,并且没有自定义迭代器(你实际上不需要IEnumerable< T>来键入迭代 – 事实上你甚至不需要IEnumerable来使用foreach;很多1.1类型写了特殊的枚举器类型来避免装箱/投掷等 – 很多工作).在许多情况下,修复它们将是一个重大变化.

这里的一个简单示例是PropertyDescriptorCollection:

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

但实际上,PropertDescriptorCollection的枚举器只是IEnumerator,所以Current是对象 – 因此当你使用var时你总是得到对象:

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

将此与(同样1.1)StringCollection对比;这有一个自定义枚举器(StringEnumerator);所以如果你使用foreach和var,你会得到字符串(而不是对象).

在任何2.0及以上的版本中,期望更好的打字是合理的,原因有两个:

>泛型(对于简单的情况),可以合理地编写强类型集合
>迭代器块(对于非平凡的情况),可以编写自定义迭代器而不会疯狂

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

网友评论