Unsafe.Unbox<T>(Object) メソッド

定義

ボックス化された値に mutable ref を返します。

public:
generic <typename T>
 where T : value class static T % Unbox(System::Object ^ box);
public static ref T Unbox<T>(object box) where T : struct;
static member Unbox : obj -> 'T (requires 'T : struct)
Public Shared Function Unbox(Of T As Structure) (box As Object) As T

型パラメーター

T

ボックス化解除する型。

パラメーター

box
Object

ボックス化解除する値。

返品

T

ボックス化された値boxへのmutable ref

例外

boxnullであり、 T は null 非許容値型です。

box はボックス化された値型ではありません。

-又は-

box はボックス化された Tではありません。

T が見つかりません。

注釈

Unbox<T>メソッドは、IL unbox 命令のラッパーにすぎません。 パフォーマンスの最適化として役立ちます。 Objectを受け取る API を値型の異なる値で繰り返し呼び出す必要がある場合は、毎回新しく作成するのではなく、同じボックス オブジェクトを再利用できます。

Unbox<T> メソッドには、言語コンパイラによって強制されない重要な使用制約があり、呼び出し元の責任です。 IL unbox 命令は、制御された変更可能性のマネージド ポインターを返します。 .NETおよび.NET言語コンパイラはこの制約を表すことができないため、Unbox<T> メソッドは通常の変更可能なref Tを返します。 ただし、開発者は、Tが変更可能な構造体型であることが確実でない限り、返される参照を変更しないでください。 たとえば、 Int32 などの数値プリミティブは変更可能な構造体型ではないため、次のコードはサポートされません。

// The following line is NOT SUPPORTED.
Unsafe.Unbox<int>(obj) = 30;

これに対し、 Point などの型はパブリック プロパティ セッターを持つ変更可能な構造体であるため、プロパティ セッターを呼び出してボックス化された値を変更することがサポートされています。

// The following lines are legal and supported.
Unsafe.Unbox<System.Drawing.Point>(obj).X = 50;
Unsafe.Unbox<System.Drawing.Point>(obj).Y = 70;

ただし、参照が変更可能な構造体型であっても、参照卸売全体の置換はサポートされていません。

// Resetting the reference to default(T) is NOT SUPPORTED.
Unsafe.Unbox<System.Drawing.Point>(obj) = default(System.Drawing.Point);

// Setting the reference to a completely new value is NOT SUPPORTED.
Unsafe.Unbox<System.Drawing.Point>(obj) = new System.Drawing.Point(50, 70);

この命令の使用上の制約の詳細な説明を含む詳細については、 ECMA-335: Common Language Infrastructure (CLI) のセクション III.1.8.1.2.2 ("変更制御マネージド ポインター") および III.4.32 ("unbox -- convert boxed value type to its raw form") を参照してください。

適用対象