这可能是一个非常基本的问题,但我对它有点困惑.如果我反映Int32/Double/any值类型代码,我看到它们是结构体,如下所示:
[Serializable, StructLayout(LayoutKind.Sequential), ComVisible(true)]
public struct Double : IComparable, IFormattable, IConvertible, IComparable<double>, IEquatable<double>
{
....
}
Run Code Online (Sandbox Code Playgroud)
那么,为什么我们说.NET中的所有内容都是从System.Object派生的.我想在这里缺少一些关键点.
编辑: 让我更加困惑的是,作为结构的值类型如何从System.Object继承,这是一个类.
Meh*_*ari 33
Eric Lippert在博客文章中介绍了这一点:并非所有内容都来自于对象(这是博客条目的标题; 不是这个问题的答案.不要混淆.)
是的,所有struct的继承都System.ValueType依次从中继承System.Object.enum你声明继承自System.Enum哪个继承System.ValueType.
从本质上讲,从引用类型派生的值类型没有问题.继承是两种类型之间的"is-a"关系.但是,为了将值类型视为对象实例,必须将其装箱.当您将值传递给期望对象参数的方法时(或当您调用实现的实例方法时),这是隐式完成的System.Object.
不是每种类型,而是System.Double.
来自Eric Lippert的帖子:
所有值类型(包括枚举和可空类型)都派生自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
Run Code Online (Sandbox Code Playgroud)
更新:
在工具栏上,如果选择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