No. Проверьте вывод IL (сгенерирован в LINQPad). Это вообще не вызов конструктора. Вместо этого он сохраняет целочисленное значение 0 внутри локальной переменной, которая называется f
. Это точный вывод, который вы получаете, когда используете тип, преобразованный в перечисление.
Что касается компилятора, то Fruits f = new Fruits();
- это то же самое, что и Fruit f = (Fruit)0;
.
Fruits f = new Fruits()
IL
Program.Main:
IL_0000: nop
IL_0001: ldc.i4.0
IL_0002: stloc.0 // f
IL_0003: ret
Program..ctor:
IL_0000: ldarg.0
IL_0001: call System.Object..ctor
IL_0006: ret
Для сравнения, вот выход IL нормального класса. Посмотрите на IL_001 в разделе Program.Main, где он фактически вызывает конструктор для класса.
Program.Main:
IL_0000: nop
IL_0001: newobj UserQuery+Program+Fruits..ctor
IL_0006: stloc.0 // f
IL_0007: ret
Program..ctor:
IL_0000: ldarg.0
IL_0001: call System.Object..ctor
IL_0006: ret
Fruits..ctor:
IL_0000: ldarg.0
IL_0001: call System.Object..ctor
IL_0006: ret
Что бы вы хотели сделать с помощью такого конструктора? –
Возможно, я захочу переопределить его поведение по умолчанию возвращения Apple по умолчанию, просто задумываясь вслух. – yogi
Вы можете изменить значение по умолчанию, изменив порядок, в котором перечислены альтернативы перечисления. –