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のではなくに変更するintと、エラーコンパイラエラーCS0208が発生します:のアドレスを取得できない、サイズを取得できない、または管理対象型('type')へのポインタを宣言できません

(だけでなく)レベルstruct Sで、そのタイプでポインターを構築できるようにするための制約は何ですか?CILC#

MSDNのこのページには、、、、、、、、、、、、、、、、列挙型とポインタが許可されているほかsbyte、 「アンマネージ型のフィールドのみを含むユーザー定義の構造体型」と記載されていますが、アンマネージ型の項目は指定されていません。タイプはです。byteshortushortintuintlongulongcharfloatdoubledecimalbool

4

1 に答える 1

2

簡単にナビゲートできるバージョンのECMA-335をオンラインで見つけることができませんでしたが、ECMA-334の段落27.2には次のように書かれています。

unmanaged-typeは、reference-typetype-parameter、またはgeneric struct-typeではなく、型がunmanaged-typeではないフィールドを含まない任意の型です。つまり、アンマネージタイプは次のいずれかです。

  • sbyte、、、、、、、、、、、、、、、または。byte_ short_ ushort_ int_ uint_ long_ ulong_ char_ float_ double_decimalbool

  • 任意の列挙型

  • 任意のポインタタイプ

  • unmanaged-typesのフィールドのみを含む非汎用のユーザー定義のstruct-type

[:構築された型とtype-parametersunmanaged-typesになることはありません。エンドノート]

構造のパッキングモードは、この区別に関連していないようです。

于 2013-03-25T11:17:31.060 に答える