Considérons cet exemple de code:
public enum MyEnum { V1, V2, V3 }
int size = Marshal.SizeOf(typeof(MyEnum));
il lève l'exception:
Une exception non gérée du type 'System.ArgumentException' s'est produite dans TestConsole.exe
Renseignements supplémentaires: Type 'TestConsole.Programme+MyEnum' ne peut pas être mobilisé comme un non géré structure; non significative de la taille ou de la compensation peut être calculée.
Bien que ce code ne lance pas d'exception et d' size
contient 4:
public enum MyEnum { V1, V2, V3 }
public struct MyStruct
{
public MyEnum en;
}
int size = Marshal.SizeOf(typeof(MyStruct));
Quelqu'un peut-il expliquer pourquoi l' .NET framework ne peut pas comprendre que l' enum
est de 4 octets dans le premier exemple de code?
Mise à JOUR
La chose étrange est qu'un enum
est considéré comme un struct
par le compilateur car Marshal.Sizeof()
echec sur moi dans cette méthode générique:
public bool IoControlReadExact<T>(uint ioControlCode, out T output) where T : struct
{
output = new T();
int outBufferSize = Marshal.SizeOf(typeof(T));
IntPtr outBuffer = Marshal.AllocHGlobal(outBufferSize);
if (outBuffer == IntPtr.Zero)
return false;
try
{
uint bytesReturned;
return IoControlRead(ioControlCode, outBuffer, (uint)outBufferSize, out bytesReturned) && ((uint)outBufferSize == bytesReturned);
}
finally
{
output = (T)Marshal.PtrToStructure(outBuffer, typeof(T));
Marshal.FreeHGlobal(outBuffer);
}
}
Et le compilateur n'a pas à se plaindre enum
n'étant pas un struct
.
SOLUTION
Merci pour les nombreuses réponses. Je pourrais refactoriser ma méthode générique pour le faire fonctionner pour les structures ET les énumérations:
// determine the correct output type:
Type outputType = typeof(T).IsEnum ? Enum.GetUnderlyingType(typeof(T)) : typeof(T);
//...
int outBufferSize = Marshal.SizeOf(outputType);
//...
output = (T)Marshal.PtrToStructure(outBuffer, outputType);