代码之家  ›  专栏  ›  技术社区  ›  P.K

net中的每个类型都继承自System.Object吗?[副本]

  •  27
  • P.K  · 技术社区  · 15 年前

    这可能是一个非常基本的问题,但我对此有点困惑。

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

    那么,为什么我们说.NET中的所有内容都是从System.Object派生的呢。我想我遗漏了一些关键点。

    编辑: 更让我困惑的是,struct的值类型如何从类System.Object继承。

    4 回复  |  直到 12 年前
        1
  •  35
  •   kdbanman    9 年前

    Eric Lippert在一篇博客文章中谈到了这一点: Not everything derives from object (这是博客条目的标题;

    是的,全部 struct 继承自 System.ValueType System.Object . enum 你申报的继承人是谁 System.Enum 继承自 System.ValueType .

    更新:

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

        2
  •  8
  •   Alfred Myers    15 年前

    来自Eric Lippert的帖子:

    可为空的类型,从对象派生

    在C#中,struct是System.ValueType的合成糖,这意味着System.Double派生自System.ValueType。 由于System.ValueType派生自System.Object,因此System.Double也派生自System.Object。 您可以看到,使用.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

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

    请参见IL中的Double extends System.ValueType

        3
  •  4
  •   Community noseratio    7 年前

    就在几周前 Eric Lippert 关于这一点的博客: Not everything derives from object . 一本好书。

        4
  •  3
  •   shahkalpesh    15 年前

    ValueType 含蓄地 ,这反过来又派生自object。

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