我有基类perDat。我有来自perDat的类mPerDat。我还有来自perDat的类iPerDat类。代表mPerDat和iPerDat的两个文件完全相同,仅在类名和类型中有所不同,两者都直接在perDat之后继承。现在代码:
mPerDat mPerDatObj = perDatObj as mPerDat;
iPerDat iPerDatObj = perDatObj as iPerDat;
if (mPerDatObj != null)
{ do something with mPerDatObj }
if (iPerDatObj != null)
{ do something with iPerDatObj }
奇怪的是,mPerDatObj在转换后有很好的对象,但是iPerDatObj没有。我应该在哪里搜索问题?
答案 0 :(得分:2)
你对继承和类型转换有一个错误的概念。你拥有的是:
class PerDat
class mPerDat : PerDat
class iPerDat : PerDat
因此给定实例可以是mPerDat实例或iPerDat实例,但不能同时是两者。当您将引用转换为该实例时,其中一个必须变为null。我不确定你要做什么,但我敢打赌你想要转发给PerDat。
打个比方:
class Human
class Male : Human
class Female : Human
如果你使用Human()构造函数得到一个Human实例,那么Male()构造函数会得到一个Male实例,而Female()构造函数会得到一个Female实例。女性和男性都直接继承了人类,但显然你不能将一个人交给另一个人。但是,您可以将它们全部视为人类实例。
答案 1 :(得分:0)
专注于以下两行
mPerDat mPerDatObj = perDatObj as mPerDat;
此处您正在向perDatObj
mPerDat
然后在下面的行中你试图把它投射到iPerDat
这是不可能的,因为它们之间没有关系。所以它没有投射。
iPerDat iPerDatObj = perDatObj as iPerDat;
在将其投放到perDatObj as mPerDat
之后检查一下;做一个perDatObj.Gettype()
,它的类型为mPerDat
,并且无法动态地将其投放到iPerDat
(同样可以将自己投射/转换为我自己我们都是不同的实体,共有不同的特征)