在下面的代码中,我构建了一个指向位于任意内存位置的结构的指针:
[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
's type 更改为object
而不是int
,则会收到错误Compiler Error CS0208: Cannot take the address of, get the size of, or declare a pointer to a managed type ('type')。
允许在(不仅仅是)级别struct S
上在该类型上构建指针的约束是什么?CIL
C#
MSDN 上的这个页面说sbyte
, byte
, short
, ushort
, int
, uint
, long
, ulong
, char
, float
, double
, decimal
, bool
, 枚举和指针是允许的,以及“仅包含非托管类型字段的用户定义的结构类型”,但没有指定什么是非托管类型是。