这是非常便宜的 - 它实际上是一个无操作,真的,假设枚举有一个基础类型的int开始(这是默认的).例如,这是一个示例程序:
using System;
enum Foo { A, B, C };
class Test
{
static void Main()
{
Foo x = Foo.B;
int y = (int) x;
}
}
Run Code Online (Sandbox Code Playgroud)
并生成的代码Main(未优化):
.method private hidebysig static void Main() cil managed
{
.entrypoint
// Code size 6 (0x6)
.maxstack 1
.locals init (valuetype Foo V_0,
int32 V_1)
IL_0000: nop
IL_0001: ldc.i4.1
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: stloc.1
IL_0005: ret
} // end of method Test::Main
Run Code Online (Sandbox Code Playgroud)
有效的演员阵容为着想编译器 -在内存中的数据已经是一个合适的状态,所以它只是需要复制就像它会复制一个值int到int.
如果枚举的基础类型不是 a int,则将枚举转换为int具有与转换基础类型相同的效果int.例如,如果基础类型是long,那么你最终会得到类似于正常conv.i4投射的long方式int.
它取决于枚举本身是否基于 int; p
如果是,没有任何反应 - 枚举完全以他们int/ long任何形式表示,直到你装箱.从MyEnum : int<===>转换int是无操作.您在方法重载解析等方面熟悉的大多数区别纯粹存在于编译器中; 在IL级别,没有任何区别.