Ответ 1
Размеры short
и float
постоянны, но как CLR решил упаковать этот float в память, не обязательно постоянна. Например, на 64-битном процессоре он может решить выровнять каждое значение на 8-байтовой границе.
Из спецификации С# 4, раздел 18.5.8:
Для определенных предопределенных типов оператор
sizeof
дает постоянное значение, как показано в таблице ниже.[...]
Для всех других типов результат оператора
sizeof
определяется реализацией и классифицируется как значение, а не константа.[...]
В целях выравнивания в начале структуры, внутри структуры и в конце структуры может быть не указано заполнение.
Обратите внимание, что вы можете использовать sizeof
в этой ситуации в контексте unsafe
. Использовать ли это, или Marshal.SizeOf
, зависит от того, что вы пытаетесь сделать.