Ste*_*nov 5 c# syntax polymorphism foreach inheritance
以下代码有什么作用?
class Base { }
class Derived : Base { }
class Test
{
void Foo(List<Base> list)
{
foreach (Derived obj in list)
{
// ...
}
}
}
Run Code Online (Sandbox Code Playgroud)
我没想到它甚至可以编译,但确实如此.
Dir*_*mar 10
您正在观察的行为是根据第8.8.4节C#语言规范的foreach语句.本节定义foreach语句的语义如下:
[...]上述步骤,如果成功,则明确地生成集合类型
C,枚举器类型E和元素类型T.一个foreach形式的声明Run Code Online (Sandbox Code Playgroud)foreach (V v in x) embedded-statement然后扩展到:
Run Code Online (Sandbox Code Playgroud){ E e = ((C)(x)).GetEnumerator(); try { V v; while (e.MoveNext()) { // here the current item will be casted v = (V)(T)e.Current; embedded-statement } } finally { // Dispose e } }
编译器插入此显式转换的原因是历史性的.C#1.0没有泛型,所以为了允许像这样的简单代码
ArrayList list = new ArrayList();
list.Add(1);
foreach (int i in list)
{
...
}
Run Code Online (Sandbox Code Playgroud)
决定让编译器引入演员阵容.
绝对没有,但它以非常低效的方式做到了.
操作顺序如下:
编辑
根据您的编辑,您将冒着InvalidCastException传递列表的任何元素的风险,Foo实际上不是Derived对象.
Edit2
为什么要编译?因为foreach涉及Object列表中每个项的隐式强制转换foreach,所以在这种情况下,另一个显式强制转换为块中的指定类型Derived
| 归档时间: |
|
| 查看次数: |
1952 次 |
| 最近记录: |