为什么这个隐式转换不会导致编译时错误?

Her*_*des -2 .net c# implicit-cast

只是想了解C#.仅考虑以下简化示例.

void Main()
{
    IList<IAnimal> animals = new List<IAnimal>
    {
        new Chicken(),
        new Cow(),
    };

    // Shouldn't this line result in a compile-time error?
    foreach (Chicken element in animals)
    {
    }
}

public interface IAnimal
{
}

public class Cow : IAnimal
{
}

public class Chicken : IAnimal
{
}
Run Code Online (Sandbox Code Playgroud)

虽然第一次迭代成功,但第二次迭代不成功.老实说,我预计这会在编译时失败.有谁理解为什么它只在运行时失败?

Dam*_*ver 5

因为该foreach语句在C#语言规范中定义为具有(隐藏)显式强制转换:

上述步骤,如果成功,则明确地生成集合类型C,枚举器类型E和元素类型T.表单的foreach语句

foreach (V v in x) embedded-statement
Run Code Online (Sandbox Code Playgroud)

然后扩展到:

{
    E e = ((C)(x)).GetEnumerator();
    try {
        while (e.MoveNext()) {
            V v = (V)(T)e.Current;
            embedded-statement
        }
    }
    finally {
        … // Dispose e
    }
}
Run Code Online (Sandbox Code Playgroud)

(注意(V)(T)e.Current,"显式"强制转换为类型V)

这是不幸的是,像这样定义,因为这是你真的是需要在C#1(之前仿制药,在每一个集合你想要在一个迭代foreach是集合object)和,现在,为了向下兼容,不能更改.