C# 基类和子类之间的强制转换

C# 基类和子类之间的强制转换,c#,casting,C#,Casting,我有一个关于基类和它的子类之间的转换的问题: (1) 为什么允许这样做 BaseClass b = new ChildClassA(); ChildClassA c = (ChildClassA)b BaseClass b = new BaseClass(); ChildClassA c = (ChildClassA)c; ChildClassA c = new ChildClassA(); BaseClass b = (BaseClass)c; (2) 为什么这是不允许的 ChildCl

我有一个关于基类和它的子类之间的转换的问题:

(1) 为什么允许这样做

BaseClass b = new ChildClassA();
ChildClassA c = (ChildClassA)b
BaseClass b = new BaseClass();
ChildClassA c = (ChildClassA)c;
ChildClassA c = new ChildClassA();
BaseClass b = (BaseClass)c;
(2) 为什么这是不允许的

ChildClassA c = (ChildClassA)new BaseClass();
BaseClass b = (BaseClass)c;
(3) 为什么允许这样做

BaseClass b = new ChildClassA();
ChildClassA c = (ChildClassA)b
BaseClass b = new BaseClass();
ChildClassA c = (ChildClassA)c;
ChildClassA c = new ChildClassA();
BaseClass b = (BaseClass)c;
(4) 为什么允许这样做

BaseClass b = new ChildClassA();
ChildClassA c = (ChildClassA)b
BaseClass b = new BaseClass();
ChildClassA c = (ChildClassA)c;
ChildClassA c = new ChildClassA();
BaseClass b = (BaseClass)c;

(2) 是不允许的,因为您不能将
基类
强制转换为
ChildClassA
-通过继承
ChildClassA
的实例也是
基类
,但不是相反

  • 是允许的,因为b确实是ChildClassA
  • 不允许,因为无法将基类强制转换为childClass,因为基类不包含childClass工作所需的定义
  • 是允许的,因为ChildClass包含基类的所有定义,并且ChildClass是基类 4.和3一样吗
  • (1) 为什么允许这样做?BaseClass b=新的ChildClassA();儿童班 c=(儿童A类)b

    因为ChildClassA是一个基类

    (2) 为什么这是不允许的?ChildClassA c=(ChildClassA)新 基类();基类b=(基类)c

    因为基类不是ChildClassA

    (3) 为什么允许这样做?ChildClassA c=新的ChildClassA();基类 b=(基类)c

    因为ChildClassA是一个基类

    (4) 为什么允许这样做?ChildClassA c=新的ChildClassA();基类 b=(基类)c

    与问题3相同

    创建继承类时,可以将该类强制转换为基类的实例,因为它是该类的子类。但是,当您尝试使用基类对象创建子类时,基类并不具有子类的所有信息


    孩子知道自己的父母有什么,但父母不知道孩子有什么。

    一般来说,这是因为ChildClassA可能定义了基类不知道的东西,而ChildClassA源于基类,所以它知道关于它的一切。

    从“是a”的角度思考。我们可以说
    ChildClassA
    “的任何实例都是一个“
    BaseClass
    ,其中
    classchildclassa:BaseClass
    。但反之亦然。在这种情况下,我们不能说
    BaseClass
    “的任何实例都是“
    ChildClassA

    现在试着按照如下方式阅读代码行。我相信这次会更有意义

    new ChildClassA()
    ChildClassA
    的一个实例,那么它也“是”
    基类。因此,我们可以将
    new ChildClassA()
    分配给
    b
    ,该类型为
    BaseClass

    我们可以将
    b
    转换为
    ChildClassA
    ,因为它实际上(指向)了
    ChildClassA
    的一个实例


    我们不能将
    new BaseClass()
    转换为
    ChildClassA
    ,因为
    BaseClass
    “的实例不是”
    ChildClassA

    转换被允许或不被允许的原因是继承背后的基础

    子类(或派生类)始终是基类,但事实并非如此

    为了解释,让我们为示例类使用一些更真实的名称:

    class Animal
    {
    }
    
    class Dog : Animal
    {
    }
    
    class Cat : Animal
    {
    }
    
    因此,对于您的示例(1):

    这是真的,因为所有的狗都是动物,而你的动物b实际上是狗,所以演员阵容是成功的

    对于您的示例(2):

    这是不可能的,因为您正在将动物对象指定给狗,但您知道并非所有动物都是狗,有些动物是猫

    例如(三)及(四):


    这与上面的示例1相同。所有的狗都是动物,所以任何狗都可以被归类为动物和演员(事实上,你不需要演员,会有一个隐式演员,你可以把它写成
    动物b=c;

    注意(2)是编译器允许的-但是在运行时你会得到一个
    InvalidCastException
    。我不知道为什么我要编辑我的答案,我也想用狗的例子。我想在教学世界里,动物就像蜜蜂一样呆在编程中,呆在性爱中