Полный текст ошибки, который вы получаете:
ошибка CS0233: «System.DateTime» не имеет предопределенного размера, поэтому sizeof может использоваться только в небезопасном контексте (рассмотрите возможность использования System.Runtime.InteropServices.Marshal.SizeOf)
Поэтому, если вы используете контекст unsafe
(обязательно перейдите в «Свойства» проекта C #, вкладку «Построить» и установите флажокотметьте в «Разрешить небезопасный код», чтобы компилировать ниже), он работает нормально:
static void Main()
{
int s;
unsafe
{
s = sizeof(DateTime);
}
Console.WriteLine(s); // writes 8
}
С ключевым словом unsafe
, sizeof()
будет работать со всеми типами enum
и со всеми struct
типы, у которых нет полей экземпляра ссылочного типа (и, конечно, DateTime
- это структура без членов ссылочного типа).
Без ключевого слова unsafe
нельзя использовать sizeof
.(Однако, начиная с C # 2, вам разрешено использовать его на предопределенных типах, таких как int
и enum
, но не на других структурах, таких как DateTime
, как вы видели.)
Обратите внимание, что структура DateTime
является исключительной в том смысле, что Marshal.SizeOf<DateTime>()
(или Marshal.SizeOf(typeof(DateTime))
до .NET версии 4.5.1 (2013)) вызовет исключение.Это из-за необычной (для struct
) структуры компоновки «Авто».