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'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上在该类型上构建指针的约束是什么?CILC#

MSDN 上的这个页面sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool, 枚举和指针是允许的,以及“仅包含非托管类型字段的用户定义的结构类型”,但没有指定什么是非托管类型是。

4

1 回答 1

2

我在网上找不到易于导航的 ECMA-335 版本,但ECMA-334 第 27.2 段说:

非托管类型是不是引用类型类型参数或泛型结构类型的任何类型,并且不包含类型不是非托管类型的字段。换句话说,非托管类型是以下之一:

  • sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, 或bool.

  • 任何枚举类型

  • 任何指针类型

  • 任何仅包含非托管类型字段的非通用用户定义结构类型。

[注意:构造类型和类型参数绝不是非 托管类型尾注]

结构的包装模式似乎与这种区别无关。

于 2013-03-25T11:17:31.060 回答