Max*_*kin 19 c# foreach language-design
想象一下以下代码:
class foreach_convert
{
public static void method2()
{
List<IComparable> x = new List<IComparable>();
x.Add(5);
foreach (string s in x)
{
//InvalidCastException in runtime
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道,为什么这种foreach行为如此...而不是C#?这里发生的是对子类的隐式强制转换,它容易出错,并且似乎在语言的其他任何地方都被禁止.或者我不对吗?
PS我之所以问的原因是我的项目中的类似代码中有一个错误,我曾经在外部库中迭代一个自定义集合,这被称为类似SomeTypeCollection,但实际上提供了一个基类型项集合并且可以包含SomeOtherType.我的错,但仍然没有语言,也没有编译器提供任何明确的提示/警告,这对C#来说很不寻常......
Jon*_*eet 23
回想一下仿制药之前... foreach必须进行投射,以便你可以做出明智的事情:
foreach (string x in names)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
代替:
foreach (object tmp in names)
{
string x = (string) tmp;
// ...
}
Run Code Online (Sandbox Code Playgroud)
后者只是icky,IMO.提供隐式转换与语言的其他部分不同,但在绝大多数情况下使其更容易使用.
我怀疑如果C#有泛型和扩展方法开始(所以我们可以使用OfType和Cast)foreach不会以完全相同的方式指定.
请注意,更奇怪的是foreach:类型根本不需要实现IEnumerable.只要它有一个GetEnumerator返回一些东西,反过来方法MoveNext()和Current,C#编译器是幸福的.这意味着您可以在泛型之前实现"强类型迭代器"(以避免装箱).