If you have an Interface IFoo
and a class Bar : IFoo
, why can you do the following:
List foo = new List();
At a casual glance, it appears that this should (as in beer should be free) work. However, a quick sanity check shows us why it can't. Bear in mind that the following code will not compile. It's intended to show why it isn't allowed to, even though it looks alright up until a point.
public interface IFoo { }
public class Bar : IFoo { }
public class Zed : IFoo { }
//.....
List myList = new List(); // makes sense so far
myList.Add(new Bar()); // OK, since Bar implements IFoo
myList.Add(new Zed()); // aaah! Now we see why.
//.....
myList
is a List
, meaning it can take any instance of IFoo
. However, this conflicts with the fact that it was instantiated as List
. Since having a List
means that I could add a new instance of Zed
, we can't allow that since the underlying list is actually List
, which can't accommodate a Zed
.