C# C使用“as”进行铸造
我有以下代码:C# C使用“as”进行铸造,c#,list,inheritance,casting,C#,List,Inheritance,Casting,我有以下代码: 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 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);
}
}
但是,当将a转换为Class1时,o总是空的。有什么问题吗?问题是a不是Class1对象。这就是全部。
再次仔细阅读您的代码-为什么您认为基类对象可以强制转换为从它派生的类?因为根据您的代码,a是基类:
...
b.Add(new BaseClass());
b.Add(new BaseClass());
b.Add(new BaseClass());
...
并且不能将基类强制转换为子类,必须将基类强制转换为子类
例如:
...
b.Add(new Class1());
b.Add(new Class1());
...
在这之后就是正确的:
foreach (var a in b)
{
var o = a as Class1;//CORRECT.
}
因为你要把你的基础课变成超级课。 这就像告诉编译器,一个人总是软件开发人员,应该是相反的。所以,软件开发人员总是一个人,会计也是一个人 因此,, 基类是对人的; 第一类是软件开发者; 第二类是会计 因此,您应该将一个软件开发人员/Class1或会计师/Class2的实例添加到人员列表中,这是基本类列表
然后将BassClass标记为抽象类。所有的类都是基类,但并非所有的基类都是ClassAs,您只是在b中添加BaseClass,而不是Class1。每只狗都是动物,但并非所有的动物都是狗。因为它不会将一个类转换为另一个类,所以它只在它是该类型的实例时才赋值