Являются ли .net Enums слепыми типами?(Ранжирование) - PullRequest
3 голосов
/ 07 апреля 2011

По-видимому, есть список blittable типов, и пока я не вижу Enums специально на нем. Они в целом легкомысленны? Или это зависит от того, были ли они объявлены с базовым типом blittable?

//e.g.
internal enum SERVERCALL : uint
{
    IsHandled = 0,
    Rejected = 1,
    RetryLater = 2,
}

Ссылки исчерпаны:

Ответы [ 3 ]

4 голосов
/ 07 апреля 2011

Перечисления относятся к типу blittable. Из документации enum по ключевым словам :

Каждый тип перечисления имеет базовый тип, который может быть любым целочисленный тип, кроме символа.

Поскольку базовый тип является целочисленным (все из которых находятся в списке типов blittable), перечисление также является blittable.

3 голосов
/ 06 июня 2013

Алиостад правильно. Например, если кто-то пытается выполнить инструкцию:

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 # составляет нет вообще не упоминать о том, является ли значение перечисления непосредственно блитабельным.)

3 голосов
/ 07 апреля 2011

Enum Типы сами по себе не являются блиц-объектами (поскольку в неуправляемом мире не имеют аналогов), но значения равны.

...