我有一个小问题关于结构与LayoutKind.Explicit属性设置.我声明了可以看到的结构,一个fieldTotal为64位,fieldFirst为前32个字节,fieldSecond为最后32个字节.在将fieldfirst和fieldSecond设置为Int32.MaxValue之后,我希望fieldTotal为Int64.MaxValue,实际上不会发生.为什么是这样?我知道C#并不真的支持C工会,也许只有在interoping时才会读取这些值,但是当我们尝试设置值时,它根本不会很好的处理它?
[StructLayout(LayoutKind.Explicit)] struct STRUCT { [FieldOffset(0)] public Int64 fieldTotal; [FieldOffset(0)] public Int32 fieldFirst; [FieldOffset(32)] public Int32 fieldSecond; } STRUCT str = new STRUCT(); str.fieldFirst = Int32.MaxValue; str.fieldSecond = Int32.MaxValue; Console.WriteLine(str.fieldTotal); // <----- I'd expect both these values Console.WriteLine(Int64.MaxValue); // <----- to be the same. Console.ReadKey();
解决方法
原因是FieldOffsetAttribute需要多个字节作为参数 – 而不是位数.这样可以预期:
[StructLayout(LayoutKind.Explicit)] struct STRUCT { [FieldOffset(0)] public Int64 fieldTotal; [FieldOffset(0)] public Int32 fieldFirst; [FieldOffset(4)] public Int32 fieldSecond; }