【问题标题】: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)