gpt4 book ai didi

c# - 如何在 C# 中模拟 C++ union ?

转载 作者:可可西里 更新时间:2023-11-01 16:28:29 28 4
gpt4 key购买 nike

我有一个关于具有 LayoutKind.Explicit 属性集的结构的小问题。如您所见,我声明了 struct,其中 fieldTotal 为 64 位,fieldFirst 前 32 个字节和 fieldSecond 最后 32 个字节。将 fieldfirstfieldSecond 设置为 Int32.MaxValue 后,我希望 fieldTotalInt64 .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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com