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:A和C: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.它不可能,因为两种不同的枚举类型可能不同.
Int32只是枚举的默认底层类型,但这是可以改变的.您可以通过指定其他数据类型来更改此项,例如
enum ExampleEnum : byte
{
Value1,
Value2,
Value3
};
Run Code Online (Sandbox Code Playgroud)
以下是微软关于枚举的说法:
每个枚举类型都有一个基础类型,除了char之外,它可以是任何整数类型.
枚举元素的默认基础类型是int.
要声明另一个整数类型的枚举,例如byte,在标识符后跟类型后使用冒号,
...
枚举的已批准类型是byte,sbyte,short,ushort,int,uint,long或ulong .
由于继承和表示之间的差异,您会陷入困境。
仅仅因为B继承自A它并不意味着它B由 表示(支持)A。
AnEnum可以继承自ValueType,但由 表示(支持)int。
这有点像一个类可以通过使用(Name) 和(Age) 作为类的支持类型Person来继承。Objectstringint
重要且基本的事情是,编译器在处理多种类型时会发挥一些魔力。ValueType继承自Object但它不是引用类型,因为编译器会专门处理它。
AnEnum是一个特殊的ValueType,它有一个自动创建的支持类型 -int默认情况下 - 这完全取决于编译器。