Struct – Layout.Explicit – 构造函数 – 完全分配字段

为什么我使用:

struct MyStruct { [FieldOffset (0)] public uint Data; [FieldOffset (0)] public byte Something; } public MyStruct (uint pData) { Data = pData; // setting Data field also sets Something field } 

C#说我需要分配’Something’字段:/我知道我可以做一个“构造函数:this()”但是编译器应该知道’Data’字段包含’Something’字段。

所以,我应该先调用无参数构造函数,这是唯一的方法吗?

是的,您需要调用默认构造函数。

 public MyStruct (uint pData) : this() { //... } 

然后,编译器将在构造函数的开头生成以下IL指令:

 ldarg.0 // Push address of struct onto stack initobj MyStruct // Pop address of struct and initialize it with "all zeros" 

似乎这是不可能的,关于它的讨论已被关闭:

以下是有关此问题的讨论的链接:

https://github.com/dotnet/roslyn/issues/7323

如果定义自定义构造函数,则需要初始化结构的所有字段。 有关更多信息,请参阅结构中的MSDN教程 – 特别是在构造函数和inheritance标题下。

以下是从该链接中提取的与此相关的段落:

结构可以声明构造函数,但它们必须使用参数。 声明struct的默认(无参数)构造函数是错误的。 Struct成员不能有初始化器。 始终提供默认构造函数以将struct成员初始化为其默认值。