.net中的每个类型都inheritance自System.Object吗?

这可能是一个非常基本的问题,但我对它有点困惑。 如果我反映Int32 / Double / any值类型代码,我看到它们是结构体,看起来像:

[Serializable, StructLayout(LayoutKind.Sequential), ComVisible(true)] public struct Double : IComparable, IFormattable, IConvertible, IComparable, IEquatable { .... } 

那么,为什么我们说.NET中的所有东西都是从System.Object派生的。 我想在这里缺少一些关键点。

编辑:让我更加困惑的是,作为结构的值类型如何从System.Objectinheritance,这是一个类。

Eric Lippert在博客文章中介绍了这一点: 并非所有内容都来自于对象 (这是博客条目的标题; 不是这个问题的答案 。不要混淆。)

是的,所有struct都inheritance自System.ValueType ,而System.ValueType又inheritance自System.Objectenum你声明inheritance自System.Enuminheritance自System.ValueTypeinheritance。

更新:

本质上,从引用类型派生的值类型没有问题。 inheritance是两种类型之间的“is-a”关系。 但是,为了将值类型视为对象实例,必须将其装箱。 当您将值传递给需要对象参数的方法时(或者在调用System.Object实现的实例方法时),这是隐式完成的。

不是每种类型,但System.Double都可以。

来自Eric Lippert的post:

所有值类型(包括枚举和可空类型)都派生自object

在C#中,struct是System.ValueType的合成糖,这意味着System.Double派生自System.ValueType。 由于System.ValueType派生自System.Object,System.Double也是如此。 您可以看到使用.Net Framework源代码或使用.Net Reflector:

 .class public sequential ansi serializable sealed beforefieldinit Double extends System.ValueType 

更新:

在工具栏上,如果选择C#,您将看到(这就是您所看到的): alt text http://bqqqkg.bay.livefilestore.com/y1pk3EAm_SJtl4dn51HLrhdgHAXCS08-xY9nQUARCpT4WnBQyRHD4RLmIK9zZ4okJXMj7Xopg1EBuY_Od7_oWz7Pw/DoubleCSharp.jpg

如果您更改ComboBox并选择IL,那么您将看到: alt text http://bqqqkg.bay.livefilestore.com/y1pRXk-0rDvFjj7b8EqU9-bydzpWjVGJMq8pDbiCr6aALob3j-aC9vvbeBS4vQRedHJ5Dh2CWtYRCywMJ9FGHOaaw/DoubleIL.jpg

在IL中看到,Double扩展了System.ValueType

就在几个星期前, Eric Lippert在博客中写到: 不是所有东西都来自于对象 。 很棒的阅读。

就您的问题而言,结构体隐式地从ValueTypeinheritance,而ValueType又从对象派生。

除此之外,Eric Lippert上面发布的链接是您想要阅读的内容。