如果你有一个接口IFoo
和一个班级Bar : IFoo
,为什么你可以执行以下操作:
List<IFoo> foo = new List<IFoo>();
foo.Add(new Bar());
但你不能这样做:
List<IFoo> foo = new List<Bar>();
乍一看似乎是这个should(如啤酒中should自由)工作。然而,快速的健全性检查向我们展示了为什么它不能。请记住以下代码不会编译。它的目的是展示为什么不允许这样做,即使它looks好吧,直到某一点为止。
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
is a List<IFoo>
,这意味着它可以采用任何实例IFoo
。然而,这与它被实例化为的事实相冲突List<Bar>
。自从有了一个List<IFoo>
意味着我可以添加一个新实例Zed
,我们不能允许这样做,因为底层列表实际上是List<Bar>
,它不能容纳Zed
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)