.net 类型声明中的隐式转换?堆上存储的对象类型是什么?

.net 类型声明中的隐式转换?堆上存储的对象类型是什么?,.net,implicit-conversion,type-declaration,.net,Implicit Conversion,Type Declaration,好的,假设我有一个基类BaseClass,还有一个子类ChildClassA,它派生自BaseClass 当我这样做时会发生什么 BaseClass b=新的子类A 我所想象的是: ChildClassA被创建并作为ChildClassA类型存储在堆中 变量b被分配一个对ChildClassA的引用 存在从ChildClassA到基类的隐式转换 但该对象仍作为ChildClassA存储在堆中 我问这个问题的原因是,据我所知,一旦一个对象被声明并存储在堆上,它总是这样。转换只是告诉CLR将其视为不

好的,假设我有一个基类
BaseClass
,还有一个子类
ChildClassA
,它派生自
BaseClass

当我这样做时会发生什么

BaseClass b=新的子类A

我所想象的是:

  • ChildClassA被创建并作为
    ChildClassA
    类型存储在堆中
  • 变量
    b
    被分配一个对ChildClassA的引用
  • 存在从ChildClassA到基类的隐式转换
  • 但该对象仍作为ChildClassA存储在堆中
  • 我问这个问题的原因是,据我所知,一旦一个对象被声明并存储在堆上,它总是这样。转换只是告诉CLR将其视为不同的类型,但它实际上始终是原始类型,并且知道它仍然是原始类型


    我说得对吗?我有什么遗漏吗?

    你的理解很到位


    b
    引用
    ChildClassA
    实例。后者仍然像以前一样在堆上,并且由于将实例分配给
    基类b

    ,因此不会对新对象进行堆化,您的理解是正确的


    b
    引用
    ChildClassA
    实例。后者仍然像以前一样在堆上,并且没有新的对象因为Jove将实例分配给
    基类b

    而被堆化,你已经得到了

    转换只是告诉CLR 把它当作另一种类型对待


    实际上,这不是一种转换,更像是一种解释。

    天哪,你得到了

    转换只是告诉CLR 把它当作另一种类型对待

    实际上这不是一种转换,更像是一种解释