可能重复:
Is everything in .NET an object?
How do ValueTypes derive from Object (ReferenceType) and still be ValueTypes?
您好, 我就是不明白。 System.Object是(我认为)引用类型,但.NET中的所有数据类型都继承自它。值类型也是如此。我不明白它 - 值类型在堆栈上有它的值,但它继承自Object? 希望有人能帮我理解
答案 0 :(得分:6)
你是正确的,虽然Object是一个引用类型,值类型确实从它继承隐式,如msdn对Value Types的引用所述(根据参考,它们在技术上继承来自ValueType类,而后者继承自Object。
C#为此做了一个特例,因此值类型可以从Object的方法(如ToString)和属性中受益。此外,您可以像处理其他引用类型一样处理值类型 - 没有什么可以阻止您插入int
数组中的Object
。
答案 1 :(得分:5)
问问自己为什么你认为通常在堆栈上分配的类型会从System.Object
继承而且我认为你会发现你无法形成一个很好的理由,这很奇怪。
如果您认为这是因为对象的类型定义了它的分配位置,那就错了。 ValueType
的哪个成员负责定义其分配机制? (System.Object
的成员是什么?)
.NET中的类型继承应该包含“是”关系:例如,string
是 object
。 .NET世界中的 Everything 是object
,因此int
是object
,double
是object
等等。
您可以根据Liskov substitution principle来考虑这一点:如果我编写的代码需要object
,我应该能够处理任何类型 一个object
- 即任何东西。对于string
,int
,List<int>
等,我的代码应该同样适用。
另请注意,object
可以保证所有类型的成员都有这样的结果:GetType
,ToString
和GetHashCode
。