C # явные структуры имеют некоторые проблемы, когда речь идет о ссылках / элементах размером с указатель.
Поскольку вы должны явно указать местоположение, но «sizeof (IntPtr)» не является константой времени компиляции (в отличие от C ++ sizeof), невозможно использовать члены размером с указатель в явных структурах, когда ваша сборка должна использоваться в как 32-битные, так и 64-битные процессы.
Также возможно использовать явные структуры для «преобразования» между ссылками и указателями:
[StructLayout(LayoutKind.Explicit)]
struct Test
{
[FieldOffset(0)]
public IntPtr ptr;
[FieldOffset(0)]
public string str;
}
Когда вы сделаете это, вашей сборке потребуется разрешение небезопасного кода; и есть проблема в том, что GC не будет знать, что делать со структурным содержимым - это GC-указатель, который должен отслеживать, или это просто целое число?
Итак, чтобы ответить на ваш вопрос:
«Есть ли что-нибудь, что вы можете сделать с объединениями c ++, что вы не можете сделать с помощью явных структур c #?»
Да, в C ++ иногда полезно втиснуть два бита данных в младшие биты указателя. Это возможно, потому что два самых младших бита указателей всегда будут равны 0, когда указатель выровнен.
Черт возьми, если вы пишете двусвязный список из двух битов, вы даже можете хранить и указатели, и данные в 32 битах! («предыдущая ^ следующая ^ данные», см. связанный список XOR )
Тем не менее, вы не можете делать ничего подобного в C #, так как вы бы запутали GC.