我有以下代码:
public class BaseClass {}
public class Class1 : BaseClass {}
public class Class2 : BaseClass {}
public class BaseClassList : List<BaseClass> {}
public class Class1List : List<Class1> {}
public class Class2List : List<Class2> {}
public void Setup()
{
BaseClassList b = new BaseClassList();
b.Add(new BaseClass());
b.Add(new BaseClass());
b.Add(new BaseClass());
var list = from a in b
select a;
Class1List c1 = new Class1List();
foreach (BaseClass a in b)
{
var o = a as Class1;
if (o != null)
c1.Add(o);
}
}
但是,在将类型1转换为类时,a始终为null。有什么问题?
答案 0 :(得分:5)
问题是a
不是Class1
对象。就这样。
再次仔细阅读您的代码 - 为什么您认为BaseClass
对象可以被转换为一个派生自它的类?
答案 1 :(得分:3)
因为a
是BaseClass
:
...
b.Add(new BaseClass());
b.Add(new BaseClass());
b.Add(new BaseClass());
...
并且您无法将 base 类强制转换为 child 类,您必须这样做,反之亦然。
示例:
...
b.Add(new Class1());
b.Add(new Class1());
...
之后这是正确的:
foreach (var a in b)
{
var o = a as Class1;//CORRECT.
}
答案 2 :(得分:0)
因为您正在将基类强制转换为超类。 这就像告诉编译器“人”总是“软件开发人员”,它应该是相反的方式。因此,“软件开发人员”始终是“人”,“会计师”也是“人”。
因此, “BaseClass”是指“人”; “Class1”是“软件开发人员”; “Class2”是“会计”
因此,您应该将“Software Developer / Class1”或“Accountant / Class2”的实例添加到“Person”列表中,该列表是BaseClassList。
然后将BassClass标记为抽象。