考慮以下代碼:Marshal.SizeOf引發的ArgumentException上枚舉
public enum MyEnum { V1, V2, V3 }
int size = Marshal.SizeOf(typeof(MyEnum));
它拋出異常:
類型 'System.ArgumentException' 未處理的異常發生在 TestConsole.exe
附加信息:類型'TestConsole.Program + MyEnum'不能作爲非託管結構編組爲 ;沒有有意義的大小或偏移可以計算出 。
儘管此代碼不拋出一個異常size
包含4:
public enum MyEnum { V1, V2, V3 }
public struct MyStruct
{
public MyEnum en;
}
int size = Marshal.SizeOf(typeof(MyStruct));
任何人都可以解釋爲什麼.NET框架想不通的是,enum
是第一個樣品中4個字節碼?
UPDATE
Marshal.Sizeof()
在這個通用方法失敗對我道:
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);
}
}
,編譯器並沒有抱怨enum
不是一個struct
。
SOLUTION
我可以修改我的泛型方法,使之成爲既struct
和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)不能解釋原因,但提供了一種解決方法。 –
與此相反,它可以創建一個指向MyEnum的指針類型,並使用類型爲MyEnum *的不安全代碼。 –