根据this帖子int
是enum
的支持类型。
当我检查.NET System.Enum的源代码时,抽象类继承自System.ValueType抽象类。
但是当我检查System.Int32结构时,它继承自接口而不是System.ValueType。
相反,当我反编译 mscorlib.dll 并检查Int32
结构时,它表示该结构的基本类型为System.ValueType
。
但仍然检查反编译的源代码,我看不到有关System.ValueType
的任何内容。
这让我觉得struct
关键字会使decleration自动Sytem.ValueType,Microsoft也在此reference中表示。
但我还有一个问题。据我所知,从同一个父级继承两个不同的类并不意味着一个也继承自其他类。我的意思是,如果B:A
和C:A
这并不总是意味着C:B
。
此外,当我检查源代码System.Enum
与System.Int32
的实现完全不同时。
回到起源,在这种情况下,这是如何产生' System.Int32'是System.Enum
的支持类型?
任何人都可以解释一下吗?
问候。
答案 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。
答案 2 :(得分:3)
由于继承和表示之间存在差异,您将陷入困境。
仅仅因为B
继承自A
,并不意味着B
代表(支持)A
。
Enum
可以从ValueType
继承,但由int
代表(支持)。
它有点像Person
类可以从Object
继承,它使用string
(名称)和int
(年龄)作为支持类型上课。
重要的,基本的事情是,编译器在处理多种类型时会有一些魔力。 ValueType
继承自Object
,但它不是引用类型,因为编译器专门处理它。
Enum
是一个特殊的ValueType
,默认情况下会自动创建支持类型 - int
- 这完全取决于编译器。
答案 3 :(得分:1)
int
和enum
是两个非常不同的东西,例如你可以用整数计算(加/减),这是枚举无法做到的。很明显,两者的推动力都是截然不同的。
枚举存储与整数(通常是32位内存位置)相同,并且枚举值和int值之间存在1:1的转换。
在这个意义上,int是枚举的支持类型。