为什么编译器会让这个漏掉?

Tro*_*var 8 c#

可能重复:
Foreach可以抛出InvalidCastException吗?

请考虑以下代码块

public class Base
{
}

public class DerivedLeft : Base
{
}

public class DerivedRight : Base
{
}

class Program
{
    static void Main(string[] args)
    {
        List<Base> list = new List<Base> { new DerivedLeft(), new DerivedRight() };
        foreach (DerivedLeft dl in list)
        {
            Console.WriteLine(dl.ToString());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意foreach语句中从Base到DerivedLeft的强制转换.这编译得很好(Visual Studio 2010),没有任何错误甚至警告.显然,在第二次循环迭代中,我们将得到一个InvalidCastException.如果我被问到一个关于编译器对这些代码的反应的问题,我毫无疑问会说,编译器不会让这一点被忽视并产生至少一个警告.但显然它没有.那么,为什么编译器会让这个漏掉呢?

Joh*_*hnD 5

它正在进行隐式演员.查看关于同一主题的这篇文章,以获得Jon Skeet的精彩解释:

Foreach可以抛出InvalidCastException吗?