int是enum的支持类型

use*_*830 15 .net c# int inheritance enums

根据这篇文章int是支持类型enum.

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

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

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

在此输入图像描述

但仍然检查反编译的源代码我看不到任何关于System.ValueType.

在此输入图像描述

这让我觉得struct关键字使自动Sytem.ValueType变为自动化,微软也在此引用中表示.

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

另外,当我检查源代码时,System.Enum实现方式有很大差异System.Int32.

回到起源,在这种情况下,如何得出"System.Int32"是支持类型的结果System.Enum

谁能解释一下?

问候.

小智 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 + "\"");
  }
}
Run Code Online (Sandbox Code Playgroud)

在我的系统上,这打印

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

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

struct Foo : Enum {
  int value__;
}
Run Code Online (Sandbox Code Playgroud)

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

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


Aer*_*roX 9

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

enum ExampleEnum : byte
{
    Value1,
    Value2,
    Value3
};
Run Code Online (Sandbox Code Playgroud)

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

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

^ 来源MSDN:枚举(C#参考)


Eni*_*ity 5

由于继承表示之间的差异,您会陷入困境。

仅仅因为B继承自A它并不意味着它B由 表示(支持)A

AnEnum可以继承自ValueType,但由 表示(支持)int

这有点像一个类可以通过使用(Name) 和(Age) 作为类的支持类型Person来继承。Objectstringint

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

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