На случайный взгляд, кажется, что это должен (как в пиве должен быть свободным) работа. Тем не менее, быстрый анализ здравомыслия показывает нам, почему он не может. Имейте в виду, что следующий код не будет компилировать. Он предназначен для того, чтобы показать, почему это не разрешено, хотя это выглядит в порядке до точки.
public interface IFoo { }
public class Bar : IFoo { }
public class Zed : IFoo { }
//.....
List<IFoo> myList = new List<Bar>(); // makes sense so far
myList.Add(new Bar()); // OK, since Bar implements IFoo
myList.Add(new Zed()); // aaah! Now we see why.
//.....
myList
является List<IFoo>
, то есть он может принимать любой экземпляр IFoo
. Однако это противоречит тому факту, что он был создан как List<Bar>
. Поскольку наличие List<IFoo>
означает, что я мог бы добавить новый экземпляр Zed
, мы не можем этого допускать, поскольку базовый список на самом деле - List<Bar>
, который не может разместить Zed
.
Точный дубликат http://stackoverflow.com/questions/833447/why-is-this-cast-not-possible –
Зачем вам нужно объявлять его IFoo it mus т содержат только бары? –
@samuelcarrijo, поскольку он условно может быть инициализирован списком некоторых других IFoo. – Jimmy