33

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

enum Foo
{
    Bar
}

Foo x = new Foo();

x然后将是一个Foowith value Bar

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

4

3 回答 3

33

new T(), whenT是值类型,不是装箱操作。和 是一样的default(T)Foo x = new Foo();, Foo x = default(Foo), 并且Foo x = Foo.Bar;都做同样的事情。

参考

初始化值类型

int myInt = new int();

——或者——</p>

int myInt = 0;

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

于 2013-02-28T20:44:33.790 回答
5

Foo.Bar在 IL 级别上,和之间没有区别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>();

在这种特殊情况下new将产生一组不同的操作码

L_0005: ldloca.s e3
L_0007: initobj !!T

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

于 2013-02-28T21:30:03.443 回答
4

请参阅MSDN 关于 System.Enum Class 的条目,特别是标记为Instantiating an Enumeration Type的部分。

据我了解,创建 an 的实例会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)
于 2013-02-28T20:49:44.403 回答