Foreach可以抛出InvalidCastException吗?

想象一下以下代码:

class foreach_convert { public static void method2() { List x = new List(); x.Add(5); foreach (string s in x) { //InvalidCastException in runtime } } } 

我想知道,为什么这种foreach行为如此……不是C#式的? 这里发生的是对子类的隐式强制转换,它容易出错并且似乎在语言中的其他任何地方都被禁止。 或者我不对吗?

PS我之所以问的原因是我的项目中的类似代码中有一个错误,我曾经在外部库中迭代一个自定义Collection,它被称为SomeTypeCollection ,但实际上提供了一个基类型的集合items和可能包含SomeOtherType项目。 我的错,但仍然没有语言,也没有编译器提供任何明确的提示/警告,这对C#来说很不寻常……

回想一下仿制药之前… foreach必须投射,以便你可以做出明智的事情:

 foreach (string x in names) { // ... } 

代替:

 foreach (object tmp in names) { string x = (string) tmp; // ... } 

后者只是icky,IMO。 提供隐式转换与其他语言不同,但在绝大多数情况下使用更容易。

怀疑如果C#开始使用generics扩展方法(因此我们可以使用OfTypeCast ),那么foreach将不会以完全相同的方式指定。

请注意, foreach更加奇怪:类型根本不需要实现IEnumerable 。 只要它有一个GetEnumerator方法返回一些东西,而这个方法又有MoveNext()Current ,C#编译器很高兴。 这意味着您可以在generics之前实现“强类型迭代器”(以避免装箱)。

使用C#3我正在使用var – 所以我得到编译器警告。

foreach适用于IEnumerable,它返回object类型的对象 。 对于每个项目,对象将转换为您提供的类型。

除非你在C#3.0中使用var 。 然后,类型将从IEnumerable ,如果它是由集合实现的。