制約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 :> 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#の種類が含まれますが、list、tuple、function、class、record、または union 型は含まれません。This includes all .NET object types but not F# list, tuple, function, class, record, or union types.
明示的なメンバー制約Explicit Member Constraint [(]型パラメーター [または...または型パラメーター)]: (メンバー-signature)[(]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 型パラメーター : (new: unit-> ' a)type-parameter : ( new : unit -> 'a ) 指定された型には、パラメーターなしのコンストラクターが必要です。The provided type must have a parameterless constructor.
値型の制約Value Type Constraint : struct: 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<基になる型>: 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> 指定された型は、指定された引数と戻り値を持つデリゲート型である必要があります。一般的な使用を目的としたものではありません。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