Алиостад правильный. Например, если кто-то пытается выполнить оператор:
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
a> ключевое слово Enum
a> и Типы перечисления в Руководстве по программированию на C# делают < em>никаких упоминаний о том, является ли значение перечисления непосредственно преобразуемым.)
person
John Beyer
schedule
05.06.2013