我有一个关于具有 LayoutKind.Explicit
属性集的结构的小问题。如您所见,我声明了 struct
,其中 fieldTotal
为 64 位,fieldFirst
前 32 个字节和 fieldSecond
最后 32 个字节。将 fieldfirst
和 fieldSecond
设置为 Int32.MaxValue
后,我希望 fieldTotal
为 Int64 .MaxValue
,实际上并没有发生。为什么是这样?我知道 C# 并不真正支持 C++ union ,也许它只会在互操作时很好地读取值,但是当我们尝试自己设置值时,它根本无法很好地处理它?
[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;
}
关于c# - 如何在 C# 中模拟 C++ union ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1162262/