Подтвердить что ты не робот

Можно ли использовать экземпляр enum с новым?

Компилятор С# не жалуется, когда вы создаете экземпляр enum с помощью new:

enum Foo
{
    Bar
}

Foo x = new Foo();

x будет тогда Foo со значением Bar.

Имеет ли new Foo() какое-либо использование, о котором я не знаю? Или я просто бокс и сразу unboxing значение перечисления?

4b9b3361

Ответ 1

new T(), когда T - тип значения, не является операцией бокса. Это то же самое, что и default(T). Foo x = new Foo();, Foo x = default(Foo) и Foo x = Foo.Bar; все делают точно то же самое.

Ссылка:

Инициализация типов значений

int myInt = new int();

-или -

int myInt = 0;

Использование нового оператора вызывает конструктор по умолчанию для конкретного типа и присваивает значение по умолчанию переменной. В предыдущем примере конструктор по умолчанию присвоил значение 0 myInt. Дополнительные сведения о значениях, назначенных вызывающими конструкторами по умолчанию, см. В Таблица значений по умолчанию.

Ответ 2

На уровне IL нет разницы между Foo.Bar и new Foo(). Оба будут оценивать один и тот же набор опций кода IL

L_0001: ldc.i4.0 
L_0002: stloc.0 

Единственный случай, когда эти операции переводятся в разные ИЛ, - это когда операция new выполняется в общем случае

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

Method<Foo>();

В этом конкретном случае new создаст другой набор op-кодов

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

Помимо этой несколько эзотерической разницы нет практической разницы между Foo.Bar и new Foo()

Ответ 3

См. запись MSDN в классе System.Enum, особенно раздел с надписью Создание экземпляра типа перечисления.. p >

Из того, что я понимаю, создание экземпляра 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)