C# · 12月 29, 2021

c# – 为什么值类型继承自引用类型?

参见英文答案 > How do ValueTypes derive from Object (ReferenceType) and still be ValueTypes?5个
> System.ValueType Understanding7个
我有两个问题:

>我们知道所有类型都是从引用类型的Object派生出来的.我的问题是为什么int – 一个值类型 – 继承自引用类型Object?这可能吗?
>如果int是从Object派生的,为什么我们需要在将int传递给需要object作为参数的函数时使用@R_916_2419@?通常,当需要将派生类型的对象作为参数传递给基类型的期望对象时,您不需要再做任何其他操作.为什么要在这里?

对于我来说,这种情况看起来像是这种类型层次结构设计的问题.

PS.我发现this相关的问题,但答案并没有给出任何真实的洞察力 – 只是抽象地谈论框.

解决方法 我们需要小心,不要在这里混淆概念.

首先是子类型. int是对象的子类型.子类型基本上意味着由超类型保证的合同(例如“有一个方法ToString,返回一个合适的字符串重新排序”)也保证该子类型.

然后在C#中继承.在C#中,继承

>通过确保超类型提供的接口在子类型中也可用来创建子类型
>提供默认实现,即如果不覆盖方法,则可以获得超类型的实现.这基本上是一个方便的功能.

(C#中的接口实现将是另一个子类型机制的示例,它提供1但不是2)

基本上都是这样子类型或继承都不能保证内存布局,值/引用类型语义等.这些概念是正交的.

“但那不对,”你可能会说. “对象合同的一部分是”引用类型语义“.这是需要拳击的地方.每当编译时类型的值类型是引用类型(即对象,ValueType或接口)时,它会模拟参考类型语义.