Не уверен, почему бы не ожидать, что это скомпилировать.Подумайте об этом, что функционально эквивалентно:
{
List<Base> list = new List<Base>(); // creates new, empty list of Base
foreach (Derived obj in list)
{
// ...
}
}
Делает ли это более понятным то, что происходит в вашем коде?
ПРАВКА пересмотренной версии.
Теперь он выдастInvalidCastException, если ваш список содержит все, что не является экземпляром Derived.Derived 'is' Base ', поэтому по-прежнему нет проблем с компиляцией.