【问题标题】:How int is the backing type for enumint 如何是 enum 的后备类型
【发布时间】:2015-04-27 05:50:10
【问题描述】:

根据this 发布intenum 的支持类型。

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

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

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

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

这让我觉得 struct 关键字使声明 auto-Sytem.ValueType,微软也在这个 reference 中表示。

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

另外,当我查看源代码时,System.Enum 的实现与System.Int32 的实现完全不同。

那么,在这种情况下,这如何与“System.Int32”作为System.Enum 的支持类型相匹配?

谁能解释一下?

【问题讨论】:

  • "所有值类型均隐式从 System.ValueType 派生。" (msdn.microsoft.com/en-us/library/s1ax56ch.aspx)。
  • 绝对不是题外话。您可以删除 P.S 部分:)
  • 非常感谢@haim770。这些参考资料非常有用。特别是 StackOverflow 帖子是一流的。
  • 谢谢@SonerGönül。我已经删除了 P.S.很高兴我没有犯错。由于它并不完全依赖于编码示例,因此我不太确定 :)

标签: c# .net inheritance enums integer


【解决方案1】:

您混淆了 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 + "\"");
  }
}

在我的系统上,打印出来

找到类型为“System.Int32”的实例字段“value__”

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

struct Foo : Enum {
  int value__;
}

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

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

【讨论】:

  • 非常感谢您的解释@hvd。
【解决方案2】:

Int32 只是枚举的默认基础类型,但是这是可以更改的。您可以通过指定不同的数据类型来更改此设置,例如

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

这是微软关于枚举的说法:

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

^Source MSDN: enum (C# Reference)

【讨论】:

  • 非常感谢@AeroX。
【解决方案3】:

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

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

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

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

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

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

【讨论】:

  • 非常感谢@Enigmativity 的努力。
【解决方案4】:

intenum 是两个非常不同的东西,例如您可以用整数计算(加/减),而用枚举则不能。所以很明显,两者的执行是非常不同的。

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

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

【讨论】:

  • 非常感谢@DrKoch 的帮助。很有用。
猜你喜欢
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多