int是enum的支持类型

时间:2015-02-25 09:37:57

标签: c# .net inheritance enums int

根据this帖子intenum的支持类型。

当我检查.NET System.Enum的源代码时,抽象类继承自System.ValueType抽象类。

但是当我检查System.Int32结构时,它继承自接口而不是System.ValueType

相反,当我反编译 mscorlib.dll 并检查Int32结构时,它表示该结构的基本类型为System.ValueType

enter image description here

但仍然检查反编译的源代码,我看不到有关System.ValueType的任何内容。

enter image description here

这让我觉得struct关键字会使decleration自动Sytem.ValueType,Microsoft也在此reference中表示。

但我还有一个问题。据我所知,从同一个父级继承两个不同的类并不意味着一个也继承自其他类。我的意思是,如果B:AC:A这并不总是意味着C:B

此外,当我检查源代码System.EnumSystem.Int32的实现完全不同时。

回到起源,在这种情况下,这是如何产生' System.Int32'是System.Enum的支持类型?

任何人都可以解释一下吗?

问候。

4 个答案:

答案 0 :(得分:12)

您混淆enum(用于定义枚举类型的C#关键字)和Enum(此类枚举类型派生自的类)。

using System;
using System.Reflection;

enum Foo { A, B, C };

static class Program {
  static void Main() {
    foreach (var field in typeof(Foo).GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
      Console.WriteLine("Found instance field \"" + field.Name + "\" of type \"" + field.FieldType.FullName + "\"");
  }
}

在我的系统上,打印

Found instance field "value__" of type "System.Int32"

这是因为Foo被有效地定义为(伪代码,无效C#)

struct Foo : Enum {
  int value__;
}

以及一些额外的编译器支持,一些额外的静态字段列出了枚举的成员,但基本思想保持不变。

支持类型被定义为每个具体枚举类型的一部分,而不是System.Enum的一部分。它不可能,因为两种不同的枚举类型可能不同。

答案 1 :(得分:9)

Int32只是枚举的默认底层类型,但这是可以更改的。您可以通过指定其他数据类型来更改此项,例如

enum ExampleEnum : byte
{
    Value1,
    Value2,
    Value3
};

以下是微软关于枚举的说法:

  

每个枚举类型都有一个基础类型,除了char之外,它可以是任何整数类型。   枚举元素的默认基础类型是int   要声明另一个整数类型的枚举,例如byte,请在标识符后跟类型为
后使用冒号   ...
  枚举的已批准类型是byte,sbyte,short,ushort,int,uint,long或ulong。

^ Source MSDN: enum (C# Reference)

答案 2 :(得分:3)

由于继承表示之间存在差异,您将陷入困境。

仅仅因为B继承自A,并不意味着B代表(支持)A

Enum可以从ValueType继承,但由int代表(支持)。

它有点像Person类可以从Object继承,它使用string(名称)和int(年龄)作为支持类型上课。

重要的,基本的事情是,编译器在处理多种类型时会有一些魔力。 ValueType继承自Object,但它不是引用类型,因为编译器专门处理它。

Enum是一个特殊的ValueType,默认情况下会自动创建支持类型 - int - 这完全取决于编译器。

答案 3 :(得分:1)

intenum是两个非常不同的东西,例如你可以用整数计算(加/减),这是枚举无法做到的。很明显,两者的推动力都是截然不同的。

枚举存储与整数(通常是32位内存位置)相同,并且枚举值和int值之间存在1:1的转换。

在这个意义上,int是枚举的支持类型