C# 用new实例化枚举有什么用吗?

C# 用new实例化枚举有什么用吗?,c#,C#,当您使用new实例化enum时,C#的编译器不会抱怨: enum Foo { Bar } Foo x = new Foo(); x将是一个Foo值为Bar new Foo()有我不知道的用途吗?还是我只是装箱并立即取消装箱枚举值?new T(),当T是值类型时,不是装箱操作。这与default(T)相同Foo x=新Foo(),Foo x=default(Foo),以及Foo x=Foo.Bar都做完全相同的事情 : 初始化值类型 int myInt = new int(); -或

当您使用
new
实例化
enum
时,C#的编译器不会抱怨:

enum Foo
{
    Bar
}

Foo x = new Foo();
x
将是一个
Foo
值为
Bar

new Foo()
有我不知道的用途吗?还是我只是装箱并立即取消装箱枚举值?

new T()
,当
T
是值类型时,不是装箱操作。这与
default(T)
相同<代码>Foo x=新Foo(),
Foo x=default(Foo)
,以及
Foo x=Foo.Bar都做完全相同的事情

:

初始化值类型

int myInt = new int();
-或-

int myInt = 0;
使用新运算符调用特定类型的默认构造函数,并将默认值指定给变量。在前面的示例中,默认构造函数将值0分配给myInt。有关通过调用默认构造函数指定的值的更多信息,请参阅

请参阅,特别是标记为“实例化枚举类型”的部分

据我所知,创建
Enum
的实例会为该
Enum
提供默认值(即
0

示例(直接取自MSDN文章):

public class Example
{
   public enum ArrivalStatus { Late=-1, OnTime=0, Early=1 };
   public static void Main()
   {
      ArrivalStatus status1 = new ArrivalStatus();
      Console.WriteLine("Arrival Status: {0} ({0:D})", status1);
   }
}
// The example displays the following output: 
//       Arrival Status: OnTime (0)

在IL级别上,
Foo.Bar
new Foo()
之间没有区别。两者都将计算为同一组IL操作码

L_0001: ldc.i4.0 
L_0002: stloc.0 
这些操作转换为不同IL的唯一情况是当
new
操作一般地完成时

void Method<T>() where T : struct {
  T local = new T();
}

Method<Foo>();

除了这个有点深奥的区别之外,
Foo.Bar
new Foo()

之间没有实际的区别。值得注意的是,
Foo x=new Foo()
不会自动创建
Foo
。只有当有一个foo的值为0时,它才会初始化foo。看一看:@TimSchmelter,我以为枚举不能为空。如果0上没有,Foo会是什么?@Ashburaczenko:看看ideone链接。它不是null,它的类型是
FooBar
,但它有点未定义。因此,我们应该始终明确地创建一个枚举变量。@TimSchmelter
new Foo()
Foo
为任何值类型时将始终为
default(Foo)
,而对于
enum
s,无论该值是否存在常量,该变量始终为
(Foo)0
。它不是一种未定义的类型,枚举变量能够保存与任何常量(想想标志)不对应的值是正常的。对非引用类型的对象使用“new someEnumType()”似乎会混淆语言,有人能评论一下允许这样做的动机是什么吗?值得指出的是:它仍然不是新的,不同的是:
default(T)
对我来说编译成完全相同的
ldloca.s
/
initobj
L_0005: ldloca.s e3
L_0007: initobj !!T