LayoutKind.Sequential не используется, если в substruct есть LayoutKind.Explicit

При запуске этого кода:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace StructLayoutTest
{
    class Program
    {
        unsafe static void Main()
        {
            Console.WriteLine(IntPtr.Size);
            Console.WriteLine();


            Sequential s = new Sequential();
            s.A = 2;
            s.B = 3;
            s.Bool = true;
            s.Long = 6;
            s.C.Int32a = 4;
            s.C.Int32b = 5;

            int* ptr = (int*)&s;
            Console.WriteLine(ptr[0]);
            Console.WriteLine(ptr[1]);
            Console.WriteLine(ptr[2]);
            Console.WriteLine(ptr[3]);
            Console.WriteLine(ptr[4]);
            Console.WriteLine(ptr[5]);
            Console.WriteLine(ptr[6]);
            Console.WriteLine(ptr[7]);  //NB!


            Console.WriteLine("Press any key");
            Console.ReadKey();
        }

        [StructLayout(LayoutKind.Explicit)]
        struct Explicit
        {
            [FieldOffset(0)]
            public int Int32a;
            [FieldOffset(4)]
            public int Int32b;
        }

        [StructLayout(LayoutKind.Sequential, Pack = 4)]
        struct Sequential
        {
            public int A;
            public int B;
            public bool Bool;
            public long Long;
            public Explicit C;
        }
    }
}

Я ожидаю, что этот вывод ОБА на x86 и x64:
4 или 8 (в зависимости от x86 или x64)

2
3
1
6
0
4
5
мусор

Что я получаю вместо этого на x86:
4

6
0
2
3
1
4
5
мусор

Что я получаю вместо этого на x64:
8

6
0
2
3
1
0
4
5

Больше:
- Проблема исчезает, когда я удаляю атрибуты LayoutKind.Explicit и FieldOffset.
- Проблема исчезает, когда я убираю поле Bool.
- Проблема исчезает, когда я удаляю поле Long.
- Обратите внимание, что на x64 кажется, что параметр атрибута Pack = 4 тоже игнорируется?

Это относится к .Net3.5, а также .Net4.0

Мой вопрос: что мне не хватает? Или это ошибка?
Я нашел похожий вопрос:
Почему LayoutKind.Sequential работает иначе, если структура содержит поле DateTime?
Но в моем случае макет меняется даже при изменении атрибута подструктуры без каких-либо изменений типов данных. Так что это не похоже на оптимизацию. Кроме того, я хотел бы отметить, что другой вопрос до сих пор остается без ответа.
В этом другом вопросе они упоминают, что компоновка соблюдается при использовании Marshalling. Я не проверял это сам, но мне интересно, почему макет не соблюдается для небезопасного кода, так как все соответствующие атрибуты, кажется, на месте? Упоминается ли где-нибудь в документации, что эти атрибуты игнорируются, если не выполнить маршаллинг? Почему?
Учитывая это, могу ли я ожидать, что LayoutKind.Explicit будет надежно работать с небезопасным кодом?
Кроме того, в документации упоминается мотив сохранения структур с ожидаемым расположением:

Чтобы уменьшить проблемы, связанные с компоновкой, связанные с компилятором Auto value, компиляторы C #, Visual Basic и C ++ задают последовательную компоновку для типов значений.


Но этот мотив, очевидно, не относится к небезопасному коду?

Ответы на вопрос(1)

Ваш ответ на вопрос