这可能是一个非常基本的问题,但我对它有点困惑。 如果我反映Int32 / Double / any值类型代码,我看到它们是结构体,看起来像:
[Serializable, StructLayout(LayoutKind.Sequential), ComVisible(true)]
public struct Double : IComparable, IFormattable, IConvertible, IComparable<double>, IEquatable<double>
{
....
}
那么,为什么我们说.NET中的所有内容都是从System.Object派生的。我想在这里缺少一些关键点。
修改 让我更加困惑的是,struct的值类型如何从System.Object继承,这是一个类。
答案 0 :(得分:33)
Eric Lippert在博客文章中介绍了这一点:Not everything derives from object(这是博客条目的标题; 不是这个问题的答案。不要混淆。)< / p>
是的,所有struct
都继承自System.ValueType
,System.Object
继承自enum
。 System.Enum
您声明继承自System.ValueType
的继承自System.Object
的{{1}}。
从本质上讲,从引用类型派生的值类型没有问题。继承是两个类型之间的“is-a”关系。但是,为了将值类型视为对象实例,必须将其装箱。当您将值传递给需要对象参数的方法时(或者当您调用{{1}}中实现的实例方法时),这是隐式完成的。)
答案 1 :(得分:7)
不是每种类型,但System.Double都可以。
来自Eric Lippert的帖子:
所有值类型,包括枚举和 可空类型,派生自对象
在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
答案 2 :(得分:4)
就在几周前Eric Lippert发表了关于此事的博文:Not everything derives from object。很棒的阅读。
答案 3 :(得分:3)
就您的问题而言,结构从ValueType 隐式继承,而后者又从对象派生。
除此之外,Eric Lippert上面发布的链接是您想要阅读的内容。