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.InteropServices和LayoutKind.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代码中实现*并集。现在我明白了引用类型不能重叠。谢谢你的回复和解释。