【问题标题】:Generics inheritance... doesn't work [duplicate]泛型继承......不起作用[重复]
【发布时间】:2014-01-27 11:27:38
【问题描述】:

为什么这不会编译?也许 FW5 可以启用它...

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

    public class Foo
    {

    }

    public class Goo : Foo
    {

    }

Stackover 流程​​说我的帖子主要是代码......但这可能是个问题,所以我正在尝试通过代码文本比率验证......希望这就足够了

现在它是说我没有正确描述问题.. 再读一遍对我来说似乎很好......

【问题讨论】:

    标签: c# generics inheritance


    【解决方案1】:

    因为Goo 的列表不是Foo 的列表。如果可行,您可以(在编译时):

    foos.Add(new Foo());
    

    这显然行不通,因为该列表只能采用 Goo 实例。

    确实存在差异(取决于框架版本),但仅限于 a:仅限于接口和委托(不是具体类型,如列表),以及 b:仅限于 known-all-“in”或 known-all-“out”场景。

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

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

    在这种情况下,它可以正常工作,因为每个Goo 都静态地被称为Foo。从技术上讲,这使用了IEnumerable&lt;out T&gt; 签名的out 部分。

    【讨论】:

    • 嗨,Marc,感谢您的回答.. 基本上在使用“IEnumerable goos = new List();”时不滥用 ICollection 功能非常有意义。所以 (T out).. 而不是 (T in) :)
    【解决方案2】:

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

    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!
    

    【讨论】:

      猜你喜欢
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 2020-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多