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

标签 c# .net c++ struct unions

我有一个关于具有 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/

相关文章:

c++ - 具有类数组对象实例化的 vector

c# - 带有 AND 运算符的 LINQ 子查询不显示任何结果

c# - @Html.HiddenFor 不适用于 ASP.NET MVC 中的列表

c# - 反序列化嵌套类时不希望出现 xmlns =''

.net - 从 Excel 中删除功能区

c# - 在数据绑定(bind)之前过滤掉 Sitecore 项目

c++ - Qt:创建铅笔/画笔工具

c++ - 如何更改 MSVC++ 的 std::tuple 支持的模板参数的数量?

c# - 将 WCF RIA 服务查询结果加载到 ObservableCollection

c# - 动态转换问题