我有一种类型,我试图从一些C代码填充。但是,当我将枚举类型作为结构的一部分时,尝试计算字节偏移时,我会得到一些非常奇怪的行为。
在这个例子中,您可以看到我已经指定所有字段应该以字节偏移量0开始(假设C类型是一个联合)。我有两个定义的枚举,一个是大小的int,一个是大小字节。
{
public enum ByteEnum : byte { }
public enum IntEnum : int { }
[StructLayout(LayoutKind.Explicit)]
public struct UserData
{
[FieldOffset(0)]
public int i1;
[FieldOffset(0)]
public long l1;
[FieldOffset(0)]
public IntEnum intEnum;
[FieldOffset(0)]
public int i2;
[FieldOffset(0)]
public int i3;
[FieldOffset(0)]
public ByteEnum byteEnum;
[FieldOffset(0)]
public int i4;
}
}
当我打电话时
Marshal.OffsetOf(type, fieldInfo.Name)
我希望它为所有字段返回0,因为我已明确将其设置为所有字段偏移。
实际上这是我的输出:
UserData
i1 : 0
l1 : 0
intEnum : 0
i2 : 4
i3 : 4
byteEnum : 4
i4 : 5
请注意,在每个枚举字段之后,OffsetOf会一直返回0 + sizeof(枚举字段)。这导致我得到C结构的完全错误的字节偏移。我不知道为什么会这样?有什么想法吗?有什么特别关于枚举类我错过了导致这种行为吗?提前致谢