C# 泛型继承。。。不';行不通

C# 泛型继承。。。不';行不通,c#,generics,inheritance,C#,Generics,Inheritance,为什么这个不能编译?也许FW5可以让你 static void Main(string[] args) { List<Foo> foos = new List<Goo>(); } public class Foo { } public class Goo : Foo { } static void Main(字符串[]args) { List foos=新列表(); } 公

为什么这个不能编译?也许FW5可以让你

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

    public class Foo
    {

    }

    public class Goo : Foo
    {

    }
static void Main(字符串[]args)
{
List foos=新列表();
}
公开课Foo
{
}
公开课古:富
{
}
StackoverFlow说我的帖子主要是代码。。。但这可能是个问题,所以我正试图通过代码-文本比率验证。。。。希望这足够了


现在是说我没有正确描述这个问题。。只要再读一遍,我觉得很好

因为
Goo
的列表不是
Foo
的列表。如果这样做有效,您可以(在编译时)执行以下操作:

这显然是行不通的,因为列表只能包含
Goo
实例

差异确实存在(取决于框架版本),但仅限于a:接口和委托(不是列表之类的具体类型),b:已知所有“输入”或已知所有“输出”场景

例如,以下内容将在最新的框架/编译器版本上编译:

IEnumerable<Goo> goos = new List<Goo>();
IEnumerable<Foo> foos = goos;
IEnumerable goos=new List();
IEnumerable foos=goos;

在这个场景中,它工作得很好,因为每个
Goo
静态地被称为
Foo
。从技术上讲,这使用了
IEnumerable
签名的
out
部分。

不允许这样做的原因是它允许这样的代码:

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!
公共类哺乳动物{}
公猫类:哺乳动物{}
公营犬类:哺乳动物{}
...
列表猫=新列表();
列出哺乳动物=猫;//想象一下这个编译。
哺乳动物。添加(新狗());//我们刚刚在猫的名单上加了一只狗!

嗨,马克,谢谢你的回答。。基本上,在使用“IEnumerable goos=new List();”时,最好不要滥用ICollection功能。所以(T out)。。而不是(T英寸):)
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!