2013-03-25 56 views
3

在下面的代碼我建立一個指針定位在任意存儲位置的結構體:有效用途

[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 MSDNsbytebyteshortushortintuintlongulongcharfloatdoubledecimalbool,枚舉和指針是允許的,以及「用戶定義的結構,它包含字段類型只有非託管類型「,但沒有指定什麼是非託管類型。

+1

巧合的是,非託管類型是'sbyte','byte','short','ushort','int','uint','long','ulong','char','float','double ','decimal','bool',枚舉和指針。 – 2013-03-25 09:53:33

+0

@FrédéricHamidi我有點猜到了,但我想從官方文檔或ECMA 335標準中明確說明。另外,我不確定結構是否應該有'StructLayout(LayoutKind.Explicit)'或類似的需求。 – 2013-03-25 10:29:42

回答

2

我不能在網上找到ECMA-335易於瀏覽的版本,但ECMA-334 paragraph 27.2說:

非託管型是任何類型的不是引用類型,一個 類型參數或通用結構類型並且不包含 類型不是非託管類型的字段。換句話說,一個非託管型是下列 之一:

  • sbytebyteshortushortintuintlongulongcharfloatdoubledecimal,或bool

  • 任何枚舉型

  • 任何指針型

  • 任何非通用的用戶定義的包含非託管類型只的字段結構類型

[:構造類型和類型參數從來 非託管類型注完]

結構的包裝方式似乎並沒有被相關與這個區別。