结构是否可以从c#中的类派生?

结构是否可以从c#中的类派生?,c#,class,struct,C#,Class,Struct,结构是否可以从c#中的类派生 如果不是,为什么原始数据类型(如int)可以从类对象派生?因为数据类型int基本上是一种结构类型(值类型) 这只是规则的一个例外吗?所有结构都继承System.ValueType,而后者又继承对象 您不能更改它。整数和其他值类型(例如bool)是对象,因为它允许它们利用继承(即它们可以访问公共的.Equals(),.GetType(),.ToString()函数) 这是.NET框架中的设计决策。它们使用公共代码库,而不是为System.ValueType下的所有值类

结构是否可以从c#中的类派生

如果不是,为什么原始数据类型(如int)可以从类
对象
派生?因为数据类型int基本上是一种结构类型(值类型)


这只是规则的一个例外吗?

所有结构都继承
System.ValueType
,而后者又继承
对象


您不能更改它。

整数和其他值类型(例如bool)是对象,因为它允许它们利用继承(即它们可以访问公共的
.Equals()
.GetType()
.ToString()
函数)

这是.NET框架中的设计决策。它们使用公共代码库,而不是为System.ValueType下的所有值类型编写单独的函数


阶级等级结构的工作原理如下(简化):

对象->值类型->整数 对象->值类型->结构

c#定义的结构不允许继承

下面是一篇很好的文章,描述了stucts在C语言中的作用:


当运行时为某个类型分配存储位置,或生成对某个类型进行操作的代码时,它会检查该类型是否派生自
System.ValueType
,而不是
System.ValueType
本身。除非存储位置满足这些条件,否则它将保存一个堆对象引用,并且对其成员(字段、方法、属性等)进行操作的任何代码都将作用于被引用的对象。否则,存储位置将保存该类型的所有公共和私有字段(在该类型的所有存储位置中的布局相同),对其成员进行操作的任何代码都将对存储位置本身进行操作

如果试图将值类型存储到类
ValueType
的存储位置,或不是从
ValueType
派生的存储位置,系统将生成该存储位置类型的新堆对象,然后在适当的存储位置存储对该对象的引用。虽然从
System.ValueType
派生的类型的存储位置以及访问这些类型的代码都会受到运行时的特殊处理,但是从
System.ValueType
继承的堆对象实例(例如刚才提到的新创建的实例)只是碰巧从
System.ValueType
派生的堆对象,和具有本质上与其他类型相同的继承行为,因此可能会被期望处理堆引用的代码传递

objectfoo=newsystem.Drawing.Point(3,4)这样的语句实际上涉及三种情况:

  • “System.Drawing.Point(3,4)”类型的一种未命名的临时存储位置,保存该类型的私有字段(两个整数),并初始化为(3,4)。请注意,此存储位置不包含“对象”;它包含两个整数,编译器知道这两个整数代表它的字段。
  • 类型为“System.Drawing.Point”的堆对象。因为这是一个堆对象,所以它继承自'System.object',所有堆对象也是如此。
  • 类型为“Object”的存储位置,由变量名“Foo”表示。
    所有这一切的结果是,虽然值类型可以定义为继承自
    对象的
    值类型
    ,而堆对象的类型继承自
    值类型
    ,但它们确实继承自
    对象
    ,值类型的存储位置不保存从
    对象继承的内容

    在语言中有许多事情是由编译器完成的(或在更低的级别上),但您自己无法完成。这就是一个这样的例子。@Servy:事实上,这并不完全正确。所以我所说的继承是在较低的级别上完成的,而我们作为开发人员被剥夺了这样的权利?这是不公平的:)@nithishinpuititofhappiness请记住,结构仍然可以实现接口,这可能会解决您的问题。@SLaks我从来没有想过要说别的,我不明白您是如何从我说的话中得到这一点的。我指的是简单地将任何结构的超类型定义为您无法控制的东西,但我也想到了其他一些不相关的事情,它们是编译器/运行时的特殊情况,无法通过普通C#代码实现。我不想:)我只是想知道我们是否也可以以未知的方式从类继承结构。结构不能从类扩展!该语言只有一个例外,即可以访问.Equals()之类的方法。这有助于:)@nithishinpuititofhappiness否,实际上
    System.ValueType
    是一个类,因此所有结构都必须派生自一个类,即类
    System.ValueType
    。但不允许从
    System.ValueType
    以外的其他类派生。甚至不允许指定基类(它必须是“自动”的
    System.ValueType
    )。类
    System.ValueType
    派生自
    System.Object
    。这就是结构继承
    System.Object
    的所有成员的原因。与
    int
    相同:它是一个结构,它派生自类
    System.ValueType
    。您:它检查类型是否派生自
    System.ValueType
    ,但不是
    System.ValueType
    本身。当然,还有
    System.Enum
    ,它是从
    ValueType
    派生出来的类,如果你说
    Enum e=DayOfWeek.星期四同样的装箱也会发生。@JeppeStigNielsen:我从未见过
    System.Enum
    用作存储位置的类型。我想,它的工作原理解释了为什么不能使用
    Enum
    约束(因为将某个对象约束为
    Enum
    将意味着它必须是枚举类型,或者
    System.Enum
    哪个