想象一下下面的代码:
class foreach_convert
{
public static void method2()
{
List<IComparable> x = new List<IComparable>();
x.Add(5);
foreach (string s in x)
{
//InvalidCastException in runtime
}
}
}
我想知道,为什么这个 foreach 行为如此......不像 C# 那样?
这里发生的是对子类的隐式转换,这很容易出错,并且似乎在该语言的所有其他地方都被禁止。还是我不对?
附:我问的原因是我的项目中的类似代码中有一个错误,我曾经在其中迭代来自外部库的自定义集合,该集合被称为SomeTypeCollection
,但实际上提供了基本类型项目的集合,并且可能包含以下项目SomeOtherType
。我的错,但语言和编译器仍然没有提供任何明确的提示/警告,这对于 C# 来说是很不寻常的......
回想一下泛型之前......foreach
必须进行转换,以便您可以做一些明智的事情,例如:
foreach (string x in names)
{
// ...
}
代替:
foreach (object tmp in names)
{
string x = (string) tmp;
// ...
}
在我看来,后者实在是太恶心了。提供隐式转换与语言的其他部分不同,但使其在绝大多数情况下更易于使用。
I suspect如果 C# 有泛型and首先使用扩展方法(所以我们可以使用OfType http://msdn.microsoft.com/en-us/library/bb360913.aspx and Cast http://msdn.microsoft.com/en-us/library/bb341406.aspx) that foreach
不会以完全相同的方式指定。
请注意,还有更奇怪的地方foreach
: 该类型不必实现IEnumerable
根本不。只要它有一个GetEnumerator
方法返回一些东西,而这些东西又具有MoveNext()
and Current
,C# 编译器很高兴。这意味着您可以在泛型之前实现“强类型迭代器”(以避免装箱)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)