泛型继承...不起作用

时间:2014-01-27 11:27:39

标签: c# generics inheritance

为什么这不会编译?也许FW5可以实现......

    static void Main(string[] args)
    {
        List<Foo> foos = new List<Goo>(); 
    }

    public class Foo
    {

    }

    public class Goo : Foo
    {

    }

Stackover流程说我的帖子主要是代码......但那可能有问题所以我试图通过代码文本比率验证....希望这就够了

现在它说我没有正确描述这个问题..再次阅读它似乎很好我...

2 个答案:

答案 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!