首页 新闻 搜索 专区 学院

C#所有值类型都隐式派生自System.ValueType

0
悬赏园豆:10 [已解决问题] 解决于 2011-11-03 13:28

"C#所有值类型都隐式派生自System.ValueType" 觉得有些不妥

可是, 所有值类型都是密封的, 不可以有继承与被继承,只能实现接口

不是相矛盾了吗? 而且ValueType是引用类型的。 求开导。。。


夏小莫的主页 夏小莫 | 初学一级 | 园豆:136
提问于:2011-11-01 15:58
< >
分享
最佳答案
1

Inherently, there's not a problem with a value type being derived from a reference type. Inheritance is a "is-a" relationship between two types. However, in order to treat a value type as an object instance, it has to be boxed. This is done implicitly when you are passing a value to a method that expects an object parameter (or when you call instance methods implemented in System.Object.)

来源: http://stackoverflow.com/questions/1316626/does-every-type-in-net-inherit-from-sytem-object/1316632#1316632

收获园豆:10
水牛刀刀 | 大侠五级 |园豆:6350 | 2011-11-01 16:40
其他回答(4)
0

引用类型应该只是语义上的理解,继承了引用类型,但是使用的时候按照值类型的语义处理(即:传递副本不是传递引用)所以是值类型。

小小刀 | 园豆:1991 (小虾三级) | 2011-11-01 20:01
0

就我了解,值类型是结构,当然不能被继承,如有不同意见,欢迎讨论,呵呵,我也是新手

流云行水 | 园豆:205 (菜鸟二级) | 2011-11-01 22:03
0

所有类型的根是obejct~然后~值类型转换到引用类型是~是装箱~  int a = 1;    obejct b =a ; 在堆栈中分配内存 b 。然后你再看一下树形继承图 C#所有值类型都隐式派生自System.ValueType, System.ValueType好像派生自object。然后再按照 int a = 1;    obejct b =a ;理解就ok了 。我说的有点答非所问~你问的问题没有必要去理解~理解装箱和拆箱自然就理解引用类型和值类型之前的关系了~

黑曼巴_6325 | 园豆:205 (菜鸟二级) | 2011-11-01 22:14
0

呵呵,多说两句。

结合@ 小小刀 和@ 黑曼巴_6325 的回复就好理解了。

值类型和引用类型根类都是object,这是肯定的。但是.net是动态加载运行的,也就是说CLR在运行时把值类型装载到栈,把引用类型装载到堆,栈中只提供一个引用指向堆,即所谓的引用(类似C++中的指针)。

由于以上的过程,所以就出来了参数传递的不同和装箱拆箱的问题。

胡屯 | 园豆:714 (小虾三级) | 2011-11-02 09:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册