值类型继承自System.Object ...为什么?

Tho*_*mas 14 c# types object

可能重复:
.NET中的所有内容都是对象吗?
ValueTypes如何从Object(ReferenceType)派生而仍然是ValueTypes?

嗨,我只是不明白.System.Object是(我认为)引用类型,但.NET中的所有数据类型都继承自它.值类型也是如此.我不明白它 - 值类型在堆栈上有它的值,但它继承自Object?希望有人能帮助我理解

Dan*_*Tao 6

问问自己为什么你认为通常在堆栈上分配的类型会继承System.Object而且我认为你发现你无法形成一个好理由是很奇怪的.

如果您认为这是因为对象的类型定义了它的分配位置,那么您就错了.哪个成员ValueType负责定义其分配机制?(那是什么成员System.Object?)

.NET中的类型继承应该包含" "关系:例如,a string 是一个 object..NET世界所有东西都是,所以a 是a ,a 是an 等.objectintobjectdoubleobject

你可以在条款想到这里氏替换原则:如果我写的是期望一个代码object,我应该能够处理的任何类型一个object-即任何事情.我的代码应该同样适用于a string,a int,a List<int>等.

还要注意的是object保证某些成员,所有的类型都为这样做的结果:GetType,ToString,和GetHashCode.

  • -1 这是非常糟糕的答案。它不能解释任何事情。此外,“is-a”关系并不意味着它必须从同一类派生。同样,“对象”并不意味着它必须从`System.Object` 类派生。它可能不派生自任何东西,但仍然可以是一个对象。为什么 `ValueType` 派生自 `Object` 的问题基本上是一个 *semantic* 或类型类别的问题:值类型 vs 引用类型。 (3认同)
  • 不。*大多数*时间值类型只进入堆。只有当它们是方法内的局部变量时,它们才会在堆栈上分配。请查看 Jon Skeet 的 [this](http://jonskeet.uk/csharp/memory.html) 著名博客,这将使您从各个方面都清楚了解。 (2认同)

Zac*_*h L 6

你是正确的,虽然Object是一个引用类型,值类型确实隐式地从它继承,如msdn对值类型的引用所述(根据引用,它们在技术上继承自ValueType类,而ValueType类继承自Object.

C#为此做了一个特例,因此值类型可以从Object的方法(如ToString)和属性中受益.此外,这样,您可以像处理其他引用类型一样处理值类型 - 没有什么能阻止您插入s int数组内部Object.