diesen Code vor:Marshal.SizeOf wirft Argument auf Aufzählungen
Eine nicht behandelte Ausnahme des Typs 'System.ArgumentException' aufgetreten in TestConsole.exe
:public enum MyEnum { V1, V2, V3 } int size = Marshal.SizeOf(typeof(MyEnum));
es die Ausnahme auslöst
Weitere Informationen: Typ 'TestConsole.Program + MyEnum' kann nicht Marshalled als eine nicht verwaltete Struktur sein; keine sinnvolle Größe oder Versatz kann berechnet werden.
Während dieser Code nicht eine Ausnahme und size
enthalten 4 wirft:
public enum MyEnum { V1, V2, V3 }
public struct MyStruct
{
public MyEnum en;
}
int size = Marshal.SizeOf(typeof(MyStruct));
jemand erklären kann, warum kann der .NET-Framework nicht herausfinden, dass die enum
4 Byte in der ersten Probe Code?
UPDATE
Marshal.Sizeof()
scheiterte auf mich in dieser generischen Methode:
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);
}
}
Und der Compiler beschwerte sich nicht über enum
keine struct
zu sein.
SOLUTION
ich meine generische Methode Refactoring könnte es sowohl funktioniert für struct
und enum
:
// 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);
[this] (http://stackoverflow.com/questions/4219413/c-sharp-sizeofenum-alternative-to-workaround-resharper-false-error) erklärt nicht, warum, aber gibt einen Workaround. –
Im Gegensatz dazu ist es möglich, einen Zeigertyp für 'MyEnum' zu erstellen, mit unsicherem Code, der den Typ' MyEnum * 'verwendet. –