Из спецификации 10.5.3 Летучие поля:
Тип энергозависимого поля должен быть одним из следующих:
-
Тип ссылки.
-
Тип байта, sbyte, short, ushort, int, uint, char, float, bool, System.IntPtr или System.UIntPtr.
-
Тип перечисления, имеющий базовый тип перечисления байта, sbyte, short, ushort, int, или uint.
Сначала я хочу подтвердить, что мое понимание верное: я думаю, что вышеупомянутые типы могут быть изменчивыми, поскольку они хранятся в виде 4-байтового блока в памяти (для ссылочных типов из-за его адреса), что гарантирует операцию чтения/записи является атомарным. Тип double/long/etc не может быть изменчивым, поскольку они не являются атомарным чтением/записью, так как они содержат более 4 байтов в памяти. Правильно ли я понимаю?
И второе, если первое предположение верно, почему пользовательская структура с единственным полем int
в нем (или что-то подобное, 4 байта в порядке) не может быть изменчивым? Теоретически это атомное право? Или это не допускается просто потому, что все пользовательские структуры (возможно, более 4 байтов) не разрешены к летучим по дизайну?