如果System.Enum是一个类,它怎么也可以是ValueType?

时间:2013-03-13 00:08:09

标签: c#

System.ValueType是一个类,从中派生的所有内容都是值类型,因此不能是类,因为类是引用类型。

如何将System.Enum(继承System.ValueType)定义为类?

2 个答案:

答案 0 :(得分:2)

请参阅:http://msdn.microsoft.com/en-us/library/system.valuetype.aspx

  

虽然ValueType是值类型的隐式基类,但是   无法创建直接从ValueType继承的类。代替,   个人编译器提供语言关键字或构造(例如   结构在C#和Structure ...结构在Visual Basic中)支持   创造价值类型。

回答你的问题:

  

所以说所有类都是引用类型是错误的吗?

您声明的任何类都将成为引用类型。因此,我认为将所有类视为引用类型并不是错误的。创建声明为类的值类型是不可能的。您必须使用struct关键字。如果您尝试模拟在枚举类中看到的内容:

  public class Test: ValueType
  {
      public string Text { get; set; }
  }

...您将收到错误'Test'无法从特殊类'System.ValueType'派生。我不知道是什么样的魔法使“ValueType”类变得特别,但据我所知,所有.NET语言都要求你使用特殊的关键字如struct来定义自己的值类型。这是令人困惑的,但可能有重要的目的,如优雅地处理装箱/拆箱,反射(.IsValueType?),以及类似的事情。

  

如果你有一个抽象类,你就无法实例化它,所以它会   从来没有去过堆,即。不会像参考类型一样?

是的,但这与ValueTypes完全不同。您可以声明一个类似int的ValueType,为其赋值,传递它,可以取消装箱和装箱。这些东西都不适用于抽象类。

顾名思义,对于其他一些具体的类,它是抽象。当您声明SomeAbstractClass类型的变量时,在初始化对继承该抽象类的某个具体类的引用之前,您无法对其执行任何操作。因此,与该变量的每个操作/交互都将针对具体类发生(尽管它可能会利用抽象类中的一些实现)。因此,无论何时使用抽象类变量,您实际上都在使用具体的类,因此它仍然是一个引用类型,所有类似堆的东西都适用于它,就像任何其他引用类型一样

答案 1 :(得分:2)

.NET中的所有东西都来自System.Object:

  

引用和值类型都是从最终基类Object派生的。如果值类型必须像对象一样运行,则在堆上分配使值类型看起来像引用对象的包装器,并将值类型的值复制到其中。标记包装器,以便系统知道它包含值类型。此过程称为装箱,反向过程称为拆箱。装箱和拆箱允许将任何类型视为对象。

http://msdn.microsoft.com/en-us/library/system.valuetype(v=vs.110).aspx