.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.Object
。 enum
你声明inheritance自System.Enum
inheritance自System.ValueType
inheritance。
更新:
本质上,从引用类型派生的值类型没有问题。 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上面发布的链接是您想要阅读的内容。