.assembly Test1
{
}
.class public sequential ansi beforefieldinit ValueTypeCtor.MyStruct
extends [mscorlib]System.ValueType
{
.field public int32 Field1
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
.maxstack 8
ldstr "Default constructor for value type has overriden!"
call void [mscorlib]System.Console::WriteLine(string)
ret
} // end of method MyStruct::.ctor
.method public hidebysig specialname rtspecialname
instance void .ctor(int32 field1) cil managed
{
// Code size 9 (0x9)
.maxstack 8
ldarg.0
ldarg.1
stfld int32 ValueTypeCtor.MyStruct::Field1
ret
} // end of method MyStruct::.ctor
} // end of class ValueTypeCtor.MyStruct
.class public sequential ansi sealed beforefieldinit ValueTypeCtor.MyStruct2
extends ValueTypeCtor.MyStruct
{
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
.maxstack 8
ldarg.0
call instance void ValueTypeCtor.MyStruct::.ctor()
ret
} // end of method MyStruct2::.ctor
} // end of class ValueTypeCtor.MyStruct2
Кое что о структурах (value type) в .NET
1) Структурам можно назначать собственные "конструкторы по-умолчанию".
2) Структуры можно наследовать.
Пример кода (CIL):
Код:
1) Конструктор-то можно создать. Только компилятор будет требовать вызывать его явно:
Код:
MyStruct str = new MyStruct();
2) Код соберется, да только рантайм будет ругаться при попытке загрузить тип (явно в коде имя типа писать нельзя - csc.exe от такого срывает башку)
Код:
object obj = Activator.CreateInstance(Type.GetType("ValueTypeCtor.MyStruct2, Test1"));