加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 01:33:09 所属栏目:百科 来源:网络整理
导读:如果这是重复的话请原谅我,但对我来说这是一个小问题,我只能花很长时间才能好奇.为什么当我在foreach块中使用隐式类型的循环变量时,我没有得到Intellisense?推断类型似乎非常明显. 我正在使用ReSharper,但是当我将Intellisense切换到VS时,我得到了相同的行
如果这是重复的话请原谅我,但对我来说这是一个小问题,我只能花很长时间才能好奇.为什么当我在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>().

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读