アンマネージド型 (C# リファレンス)

型は、次のいずれかの型である場合、アンマネージド型 です。

  • sbytebyteshortushortintuintlongulongcharfloatdoubledecimal、または bool
  • すべての列挙
  • すべてのポインター
  • アンマネージド型のフィールドのみが含まれるすべてのユーザー定義の構造体型で、かつ C# 7.3 以前の場合は、構築された型 (1 つ以上の型引数が含まれる型) でない

C# 7.3 以降、unmanaged 制約を使用して、型パラメーターが非ポインターで、null 非許容で、アンマネージド型であることを指定できます。

C# 8.0 以降では、次の例に示すように、アンマネージド型のフィールドのみが含まれる "構築された" 構造体型もアンマネージド型になります。

using System;

public struct Coords<T>
{
    public T X;
    public T Y;
}

public class UnmanagedTypes
{
    public static void Main()
    {
        DisplaySize<Coords<int>>();
        DisplaySize<Coords<double>>();
    }

    private unsafe static void DisplaySize<T>() where T : unmanaged
    {
        Console.WriteLine($"{typeof(T)} is unmanaged and its size is {sizeof(T)} bytes");
    }
}
// Output:
// Coords`1[System.Int32] is unmanaged and its size is 8 bytes
// Coords`1[System.Double] is unmanaged and its size is 16 bytes

ジェネリック構造体は、構築されたアンマネージド型およびアンマネージドでない型の両方のソースになる場合があります。 前の例では、ジェネリック構造体 Coords<T> を定義し、構築されたアンマネージド型の例を示します。 アンマネージド型でない例は Coords<object> です。 アンマネージドでない object 型のフィールドがあるため、これはアンマネージドではありません。 構築された "すべての" 型をアンマネージド型にする場合は、ジェネリック構造体の定義で unmanaged 制約を使用します。

public struct Coords<T> where T : unmanaged
{
    public T X;
    public T Y;
}

C# 言語仕様

詳しくは、「C# 言語仕様」の「ポインター型」をご覧ください。

関連項目