Reputation: 16125
Apparently there's a list of blittable types and so far I don't see Enums specifically on it. Are they blittable in general? Or does it depend on whether they are declared with a blittable base type?
//e.g.
internal enum SERVERCALL : uint
{
IsHandled = 0,
Rejected = 1,
RetryLater = 2,
}
References exhausted:
Upvotes: 6
Views: 3450
Reputation: 2867
instead of
int enumSize = Marshal.SizeOf(Enum.GetUnderlyingType(typeof(ConsoleColor)));
you can write
int enumSize = Marshal.SizeOf(typeof(ConsoleColor).GetEnumUnderlyingType());
actually the first one calls the second one...
Upvotes: 0
Reputation: 703
Aliostad is correct. For example, if one tries to execute the statement:
int size = Marshal.SizeOf( System.ConsoleColor.Red );
then an ArgumentException is thrown, with the message:
Type 'System.ConsoleColor' cannot be marshaled as an unmanaged structure; no meaningful size or offset can be computed.
However, the statement:
int size = Marshal.SizeOf( (int)System.ConsoleColor.Red );
works just fine as one would expect.
Likewise, the statement:
int enumSize = Marshal.SizeOf( typeof(ConsoleColor) );
fails, but the statement:
int enumSize = Marshal.SizeOf( Enum.GetUnderlyingType( typeof(ConsoleColor) ) );
succeeds.
Unfortunately, Microsoft's documentation for Marshal.SizeOf( object )
is deficient; that page doesn't even include ArgumentException
in the list of possible exceptions. The doc for Marshal.SizeOf( Type )
lists ArgumentException
, but only says that it's thrown when the type is generic (which is true, but doesn't cover the above example).
(Also, the documentation for the enum
keyword, the Enum
class, and Enumeration Types in the C# Programming Guide makes no mention at all about whether an enum value is directly blittable.)
Upvotes: 4
Reputation: 81660
Enum types themselves are not blittable (since they do not have counterpart in unmanaged world) but the values are.
Upvotes: 7
Reputation: 28172
Enums are blittable types. From the enum
keyword documentation:
Every enumeration type has an underlying type, which can be any integral type except char.
Because the underlying type is integral (all of which are on the list of blittable types), the enum is also blittable.
Upvotes: 7