在下面的代碼我建立一個指針定位在任意存儲位置的結構體:有效用途
[StructLayout(LayoutKind.Explicit)]
public struct S
{
[FieldOffset(0)] int f0;
[FieldOffset(4)] int f4;
public static void Main() {
unsafe {
S* rawPtr = (S*)0x1234;
rawPtr->f0 = 42;
}
}
}
如果更改f4
的類型object
代替我收到錯誤Compiler Error CS0208: Cannot take the address of, get the size of, or declare a pointer to a managed type ('type')。
什麼是struct S
的constaints允許建立這種類型的指針,在CIL
(而不僅僅是C#
)級別?
This page on MSDN說sbyte
,byte
,short
,ushort
,int
,uint
,long
,ulong
,char
,float
,double
,decimal
,bool
,枚舉和指針是允許的,以及「用戶定義的結構,它包含字段類型只有非託管類型「,但沒有指定什麼是非託管類型。
巧合的是,非託管類型是'sbyte','byte','short','ushort','int','uint','long','ulong','char','float','double ','decimal','bool',枚舉和指針。 – 2013-03-25 09:53:33
@FrédéricHamidi我有點猜到了,但我想從官方文檔或ECMA 335標準中明確說明。另外,我不確定結構是否應該有'StructLayout(LayoutKind.Explicit)'或類似的需求。 – 2013-03-25 10:29:42