制約Constraints

このトピックでは、ジェネリックに適用できる制約を説明します、ジェネリック型または関数の型引数の要件を指定するパラメーターを入力します。This topic describes constraints that you can apply to generic type parameters to specify the requirements for a type argument in a generic type or function.

構文Syntax

type-parameter-list when constraint1 [ and constraint2]

RemarksRemarks

ジェネリック型で使用できる型の制限に適用できるいくつかのさまざまな制約があります。There are several different constraints you can apply to limit the types that can be used in a generic type. 次の表は、これらの制約の一覧です。The following table lists and describes these constraints.

制約Constraint 構文Syntax 説明Description
型制約Type Constraint type-parameter :> typetype-parameter :> type 指定された型は、指定した型から同じか、または派生をする必要があります。 または、型がインターフェイスである場合は、指定された型がインターフェイスを実装する必要があります。The provided type must be equal to or derived from the type specified, or, if the type is an interface, the provided type must implement the interface.
Null の制約Null Constraint 型パラメーター : nulltype-parameter : null 指定された型には、null リテラルをサポートする必要があります。The provided type must support the null literal. これには、すべて .NET オブジェクトの種類がない F# リスト、タプル、関数、クラス、レコード、または共用体の型が含まれます。This includes all .NET object types but not F# list, tuple, function, class, record, or union types.
明示的なメンバー制約Explicit Member Constraint [(]型パラメーター [または... または型パラメーター)]: (メンバー シグネチャ)[(]type-parameter [or ... or type-parameter)] : (member-signature) 指定された型引数の少なくとも 1 つを指定したシグネチャを持つメンバーがあります。一般的な用途は想定されていません。At least one of the type arguments provided must have a member that has the specified signature; not intended for common use. メンバーする必要がありますか、明示的に定義するメンバーの明示的な制約の有効なターゲットにするには、型または暗黙的な型の拡張機能の一部です。Members must be either explicitly defined on the type or part of an implicit type extension to be valid targets for an Explicit Member Constraint.
コンス トラクターの制約Constructor Constraint type-parameter : ( new : unit -> 'a )type-parameter : ( new : unit -> 'a ) 指定された型には、既定のコンス トラクターが必要です。The provided type must have a default constructor.
値型の制約Value Type Constraint : 構造体: struct 指定された型は、.NET 値型である必要があります。The provided type must be a .NET value type.
参照型の制約Reference Type Constraint : 構造体ではありません: not struct 指定された型は、.NET 参照型である必要があります。The provided type must be a .NET reference type.
列挙型の制約Enumeration Type Constraint : enum<underlying-type>: enum<underlying-type> 指定された型を指定した基になる型を持つ列挙型である必要があります。一般的な用途は想定されていません。The provided type must be an enumerated type that has the specified underlying type; not intended for common use.
デリゲートの制約Delegate Constraint : delegate<tuple-parameter-type, return-type>: delegate<tuple-parameter-type, return-type> 必要がありますを指定した引数を持つデリゲート型であるし、戻り値を指定された型一般的な用途は想定されていません。The provided type must be a delegate type that has the specified arguments and return value; not intended for common use.
比較の制約Comparison Constraint : 比較: comparison 指定された型には、比較をサポートする必要があります。The provided type must support comparison.
等しいかどうかの制約Equality Constraint : 等しいかどうか: equality 指定された型には、等しいかどうかをサポートする必要があります。The provided type must support equality.
アンマネージド制約Unmanaged Constraint : 管理されていません。: unmanaged 指定された型は、アンマネージ型である必要があります。The provided type must be an unmanaged type. アンマネージ型は、プリミティブ型 (sbytebytecharnativeintunativeintfloat32floatint16uint16int32uint32int64uint64、またはdecimal)、列挙型、 nativeptr<_>、または非ジェネリック構造体のフィールドは、すべてのアンマネージ型。Unmanaged types are either certain primitive types (sbyte, byte, char, nativeint, unativeint, float32, float, int16, uint16, int32, uint32, int64, uint64, or decimal), enumeration types, nativeptr<_>, or a non-generic structure whose fields are all unmanaged types.

一般に、制約の種類がない型で使用できる機能を使用するコードがある場合に制約を追加する必要があります。You have to add a constraint when your code has to use a feature that is available on the constraint type but not on types in general. たとえば、クラス型を指定する型の制約を使用する場合は、ジェネリック関数または型では、そのクラスのメソッドのいずれかを使用できます。For example, if you use the type constraint to specify a class type, you can use any one of the methods of that class in the generic function or type.

制約を指定する場合があります必要な型パラメーターを明示的に記述する場合、制約、コンパイラがあるないため使用している機能は型の実行時に指定する場合がある任意の型では使用できないことを検証する方法にパラメーター。Specifying constraints is sometimes required when writing type parameters explicitly, because without a constraint, the compiler has no way of verifying that the features that you are using will be available on any type that might be supplied at run time for the type parameter.

使用する最も一般的な制約F#コードが型制約が基底クラスまたはインターフェイスを指定します。The most common constraints you use in F# code are type constraints that specify base classes or interfaces. その他の制約が、演算子、算術演算子のオーバー ロードを実装するために使用または主に F# をサポート、完了するために提供される明示的なメンバー制約など、特定の機能を実装するために F# ライブラリによって使用されるか、共通言語ランタイムでサポートされている制約のセット。The other constraints are either used by the F# library to implement certain functionality, such as the explicit member constraint, which is used to implement operator overloading for arithmetic operators, or are provided mainly because F# supports the complete set of constraints that is supported by the common language runtime.

型の推論プロセス中にいくつかの制約は、コンパイラによって自動的に推論されます。During the type inference process, some constraints are inferred automatically by the compiler. たとえば、使用する場合、+演算子関数で、コンパイラは、明示的なメンバー制約式で使用される変数の型を推測します。For example, if you use the + operator in a function, the compiler infers an explicit member constraint on variable types that are used in the expression.

次のコードは、いくつかの制約の宣言を示しています。The following code illustrates some constraint declarations.

// Base Type Constraint
type Class1<'T when 'T :> System.Exception> =
class end

// Interface Type Constraint
type Class2<'T when 'T :> System.IComparable> = 
class end

// Null constraint
type Class3<'T when 'T : null> =
class end

// Member constraint with instance member
type Class5<'T when 'T : (member Method1 : 'T -> int)> =
class end

// Member constraint with property
type Class6<'T when 'T : (member Property1 : int)> =
class end

// Constructor constraint
type Class7<'T when 'T : (new : unit -> 'T)>() =
member val Field = new 'T()

// Reference type constraint
type Class8<'T when 'T : not struct> =
class end

// Enumeration constraint with underlying value specified
type Class9<'T when 'T : enum<uint32>> =
class end

// 'T must implement IComparable, or be an array type with comparable
// elements, or be System.IntPtr or System.UIntPtr. Also, 'T must not have
// the NoComparison attribute.
type Class10<'T when 'T : comparison> =
class end

// 'T must support equality. This is true for any type that does not
// have the NoEquality attribute.
type Class11<'T when 'T : equality> =
class end

type Class12<'T when 'T : delegate<obj * System.EventArgs, unit>> =
class end

type Class13<'T when 'T : unmanaged> =
class end

// Member constraints with two type parameters
// Most often used with static type parameters in inline functions
let inline add(value1 : ^T when ^T : (static member (+) : ^T * ^T -> ^T), value2: ^T) =
value1 + value2

// ^T and ^U must support operator +
let inline heterogenousAdd(value1 : ^T when (^T or ^U) : (static member (+) : ^T * ^U -> ^T), value2 : ^U) =
value1 + value2

// If there are multiple constraints, use the and keyword to separate them.
type Class14<'T,'U when 'T : equality and 'U : equality> =
class end

関連項目See also