Алиостад правильно. Например, если кто-то пытается выполнить инструкцию:
int size = Marshal.SizeOf( System.ConsoleColor.Red );
затем генерируется ArgumentException с сообщением:
Тип 'System.ConsoleColor' нельзя маршалировать как неуправляемую структуру; невозможно вычислить значимый размер или смещение.
Однако утверждение:
int size = Marshal.SizeOf( (int)System.ConsoleColor.Red );
работает просто отлично, как и следовало ожидать.
Аналогично, утверждение:
int enumSize = Marshal.SizeOf( typeof(ConsoleColor) );
не удается, но утверждение:
int enumSize = Marshal.SizeOf( Enum.GetUnderlyingType( typeof(ConsoleColor) ) );
преуспевает.
К сожалению, документация Microsoft для Marshal.SizeOf( object )
недостаточна; эта страница даже не включает ArgumentException
в список возможных исключений. Документ для Marshal.SizeOf( Type )
перечисляет ArgumentException
, но говорит только о том, что он генерируется, когда тип является универсальным (что верно, но не охватывает приведенный выше пример).
(Кроме того, документация для ключевого слова enum
, класса Enum
и типов перечисления в Руководстве по программированию в C # составляет нет вообще не упоминать о том, является ли значение перечисления непосредственно блитабельным.)