int x = 6;
это работает, но
Int32 x = new Int32(6);
не. Почему конструктор Int32 по умолчанию не имеет параметров? как он присваивает x значение 6?
редактировать: больше пояснений. mscorlib/system/int32.cs,225942ed7b7a3252 строка 38:
internal int m_value;
как компилятор присваивает этому m_value 6? Конструктор Int32 не имеет параметров.
Int32 x = new Int32(6);
не то же самое, чтоint x = 6;
. То же самое будетInt32 x = 6;
, что точно работает, так какint
— это просто псевдоним дляInt32
. - person L. Guthardt   schedule 21.03.2018Int32
- это удобный тип для представления целых чисел в объектной модели, но это не то, что язык и среда выполнения действительно используют при работе с целыми числами, поскольку они имеют встроенную поддержку для этого.int x = 6
преобразуется вldc.i4.6
, непосредственно создавая целочисленную константу, вообще не затрагивая тип структуры. - person Jeroen Mostert   schedule 21.03.2018System.Int32
даже не имеет конструктора без параметров. - person Tim Schmelter   schedule 21.03.2018System.Int32
нет конструктора по умолчанию: stackoverflow.com/questions/25839595/ - person Tim Schmelter   schedule 21.03.2018Int32
имеет конструктор по умолчанию, это в основном точка зрения. Если вы спросите C#, то да, так как вы можете написатьnew Int32()
. Если спросить рантайм, то нет, так какInt32
вообще не имеет конструкторов. Ни один конструктор никогда не вызывается, что имеет смысл, поскольку экземплярыInt32
не на самом деле задействованы при работе с целыми числами. - person Jeroen Mostert   schedule 21.03.2018new Int32();
и посмотреть, говорит ли он вам, что такого конструктора не существует, это простой тест для выполнения. - person Servy   schedule 21.03.2018new Action(someMethod);
, который на самом деле не является конструктором). - person Servy   schedule 21.03.2018newobj instance void [mscorlib]System.Int32::.ctor()
недопустимо — вы можете собрать его, но во время выполнения вы получитеMissingMethodException
. Конечно, это не тот код, который на самом деле генерируется чем-либо, поскольку вы не создаетеint
s таким образом. Опять же: с точки зрения C# существует конструктор по умолчанию, поскольку все структуры имеют конструктор по умолчанию; с точки зрения IL, нет, и не требуется никакого типа, чтобы иметь конструктор. Обе точки зрения одинаково правомерны, если они четко обозначены. - person Jeroen Mostert   schedule 21.03.2018int
как экземплярInt32
, она позаботится о том, чтобыm_value
отражало значение целого числа. Ни компилятор, ни среда выполнения не ограничены правилами C#, в отличие от программистов. Из соображений эффективности среда выполнения имеет специальную обработку для таких типов, какInt32
. Вы даже не увидите явной ссылки наm_value
в байт-коде — когда этот исходный код скомпилирован, компилятор знает, что нужно преобразовать его в целочисленные инструкции (используяldind.i4
, а неldfld
). - person Jeroen Mostert   schedule 21.03.2018