C#继承和转换 - 相同的类但具有不同的名称

时间:2014-03-30 13:09:57

标签: c# inheritance casting

我有基类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没有。我应该在哪里搜索问题?

2 个答案:

答案 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(同样可以将自己投射/转换为我自己我们都是不同的实体,共有不同的特征)