Подтвердить что ты не робот

Sizeof() не известны. Зачем?

Почему я не могу использовать sizeof() для простых структур?

например:

private struct FloatShortPair
{
    public float myFloat;
    public short myShort;
};

int size = sizeof(FloatShortPair);  //CS0233

ошибка CS0233: "FloatShortPair" не имеет предопределенного размера, поэтому sizeof можно использовать только в небезопасном контексте (подумайте об использовании System.Runtime.InteropServices.Marshal.SizeOf)

MSDN:

Оператор sizeof может использоваться только для типов, которые являются компиляцией константы. Если вы получаете эту ошибку, убедитесь, что размер идентификатор может быть определен во время компиляции. Если он не может, то используйте SizeOf вместо sizeof.

Как плавающие и короткие не компилируемые константы времени? 8 -/

4b9b3361

Ответ 1

Размеры short и float постоянны, но как CLR решил упаковать этот float в память, не обязательно постоянна. Например, на 64-битном процессоре он может решить выровнять каждое значение на 8-байтовой границе.

Из спецификации С# 4, раздел 18.5.8:

Для определенных предопределенных типов оператор sizeof дает постоянное значение, как показано в таблице ниже.

[...]

Для всех других типов результат оператора sizeof определяется реализацией и классифицируется как значение, а не константа.

[...]

В целях выравнивания в начале структуры, внутри структуры и в конце структуры может быть не указано заполнение.

Обратите внимание, что вы можете использовать sizeof в этой ситуации в контексте unsafe. Использовать ли это, или Marshal.SizeOf, зависит от того, что вы пытаетесь сделать.