C#中的并集,字符串对齐不正确

C#中的并集,字符串对齐不正确,c#,union,layoutkind.explicit,C#,Union,Layoutkind.explicit,我在以下代码中出现“错误对齐或被非对象字段重叠”错误 public struct TypeA { public string A1; public string A2; } public struct TypeB { public string B1, public string B2; } 我使用System.Runtime.InteropServices和LayoutKind.Explicit实现了union [StructLayout(LayoutKind.Exp

我在以下代码中出现“错误对齐或被非对象字段重叠”错误

public struct TypeA
{
   public string A1;
   public string A2;
}
public struct TypeB
{
   public string B1,
   public string B2;
}
我使用System.Runtime.InteropServicesLayoutKind.Explicit实现了union

[StructLayout(LayoutKind.Explicit)]
public struct TypeAorB
{
   [FieldOffset(0)]
   public TypeA aa;

   [FieldOffset(0)]
   public TypeB bb;
}

我认为问题来自结构中的字符串。如何克服此问题?

为什么字段偏移量相同?它们应该是0和0+[类型A的大小]

类型A是8字节,因为您有2个字符串,每个字符串将使用4字节指针

因此

    [StructLayout(LayoutKind.Explicit)]
    public struct TypeAorB
    {
        [FieldOffset(0)]
        public TypeA aa;

        [FieldOffset(8)]
        public TypeB bb;
    }
如果要再次添加typeB的第三个字段,则需要执行以下操作:

    [StructLayout(LayoutKind.Explicit)]
    public struct TypeAorB
    {
        [FieldOffset(0)]
        public TypeA aa;

        [FieldOffset(8)]
        public TypeB bb;

        [FieldOffset(16)]
        public TypeB bb;
    }

你试图做的事是不合法的。字符串是引用类型,不能与联合中的任何其他类型重叠。这对垃圾收集器来说非常重要,它无法可靠地确定字段中存储了什么引用,因此无法可靠地确定字符串对象是否需要保持活动状态

结构的奇异之处在于,它将一个字符串与一个字符串重叠。这在技术上是可行的,垃圾收集器没有理由感到困惑,因为它总是看到一个有效的对象引用。但是它实际上并没有处理这种特殊情况,微软没有编写足够的代码,或者不想消耗cpu周期来检查类型标识

这是一个很好的理由,因为你不必在声明中重复它们。当您可以轻松避免重叠时,Microsoft编写特殊代码来识别重叠是没有意义的

在你的例子中,乌龟一直在下降,联盟的每个领域都是相同的。因此,使用联合没有任何意义


所以不要

我认为托管(非标量)类型上的别名可能是不允许的。您这样做的目的是什么?感谢各位,我要做的是实现维护一个包含多个struct*(s)的超级结构。它试图从C代码中实现*并集。现在我明白了引用类型不能重叠。谢谢你的回复和解释。