【问题标题】:Inheritance (Work with Collection.Generic)继承(使用 Collection.Generic)
【发布时间】:2014-05-14 00:19:47
【问题描述】:

我有:

class A : IHelp

class B : IHelp

然后我想做这样的事情:

List<A> alist = new List<A>();

List<IHelp> hList = (List<IHelp>) alist; // Error!!!

我是一名初级程序员。我将非常感谢您的详细解答。感谢您的帮助!

【问题讨论】:

  • 查找协变和逆变。

标签: c# generics inheritance collections


【解决方案1】:

你不能做这样的演员,因为它会违反原始列表的约束。假设这像你说的那样工作(它实际上给出了一个错误,但假设它工作):

List<A> aList = new List<A>();
List<IHelp> hList = aList; // Compile error, but say it would have worked..

那么,你可以这样做:

hList.add(new B()); // WHAT??

这没有意义,因为您永远无法将 B 类型的元素添加到 A 类型的原始列表中。这就是 C# 阻止您进行所需分配的原因。

【讨论】:

    【解决方案2】:

    这两个类共享一些属性(例如:ToString()) 该列表只能使用这些属性

    我们可以做到:

    List<object> list = new List<object>();
    list.Add("foo");
    list.Add(5);
    
    foreach(object o in list) 
    {
        Console.WriteLine(o.ToString());
    }
    

    我也有同样的问题。

    将阅读:http://msdn.microsoft.com/en-gb/library/ee207183.aspx

    这里有一些奇怪的东西:

    object[] array = new string[10];        // Possible   <-- /!\ not secured.
    List<object> list = new List<string>(); // Impossible
    

    编辑:是的,我不明白你的例子,元^^'

    但是,我们不想添加一些东西,只是阅读。

    ReadOnlyCollections 也不是逆变的:/

    编辑 2:该死。我才明白这个问题。 (“out”关键字)

    我没有 .NET 4.0 :'( 我将使用数组 ^^

    (使用 4.0 -> IEnumerable 使之成为可能)

    (使用 Unity3D)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-17
      • 2018-05-23
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      • 2016-08-15
      • 2013-12-18
      相关资源
      最近更新 更多