为什么这不会编译?也许FW5可以实现......
static void Main(string[] args)
{
List<Foo> foos = new List<Goo>();
}
public class Foo
{
}
public class Goo : Foo
{
}
Stackover流程说我的帖子主要是代码......但那可能有问题所以我试图通过代码文本比率验证....希望这就够了
现在它说我没有正确描述这个问题..再次阅读它似乎很好我...
答案 0 :(得分:8)
因为Goo
的列表不是,所以Foo
列表。如果有效,你可以(在编译时):
foos.Add(new Foo());
显然无法正常工作,因为该列表只能采用Goo
个实例。
方差确实存在(取决于框架版本),但是受限于:接口和委托(不是像列表这样的具体类型),以及b:到已知全部“在”或已知全部“出”场景。
例如,以下内容将在最近的框架/编译器版本上编译:
IEnumerable<Goo> goos = new List<Goo>();
IEnumerable<Foo> foos = goos;
在这种情况下,它运行正常,因为每个Goo
静态地知道为Foo
。从技术上讲,这会使用out
签名的IEnumerable<out T>
部分。
答案 1 :(得分:5)
你不允许这样做的原因是它允许这样的代码:
public class Mammal {}
public class Cat: Mammal {}
public class Dog: Mammal {}
...
List<Cat> cats = new List<Cat>();
List<Mammal> mammals = cats; // Imagine this compiles.
mammals.Add(new Dog()); // We just added a dog to the list of cats!