署名

シグネチャ ファイルには、型、名前空間、モジュールなど、一連の F# プログラム要素のパブリック署名に関する情報が含まれています。 これらのプログラム要素のアクセシビリティを指定するために使用できます。

注釈

F# コード ファイルごとに、 署名ファイルを作成できます。これは、コード ファイルと同じ名前を持ち、拡張子が .fsi ではなく .fsi のファイルです。 コマンド ラインを直接使用している場合は、署名ファイルをコンパイル コマンド ラインに追加することもできます。 コード ファイルと署名ファイルを区別するために、コード ファイルは 実装ファイルと呼ばれることもあります。 プロジェクトでは、署名ファイルが関連付けられているコード ファイルの前に置く必要があります。

シグネチャ ファイルは、対応する実装ファイル内の名前空間、モジュール、型、およびメンバーを記述します。 署名ファイル内の情報を使用して、対応する実装ファイル内のコードの部分に実装ファイルの外部のコードからアクセスできる部分と、実装ファイルの内部部分を指定します。 署名ファイルに含まれる名前空間、モジュール、および型は、実装ファイルに含まれる名前空間、モジュール、および型のサブセットである必要があります。 このトピックの後半で説明する一部の例外を除き、署名ファイルに記載されていない言語要素は、実装ファイルに対してプライベートと見なされます。 プロジェクトまたはコマンド ラインに署名ファイルが見つからない場合は、既定のアクセシビリティが使用されます。

既定のアクセシビリティの詳細については、「 アクセス制御」を参照してください。

シグネチャ ファイルでは、各メソッドまたは関数の型と実装の定義を繰り返しません。 代わりに、各メソッドと関数のシグネチャを使用します。これは、モジュールまたは名前空間フラグメントによって実装される機能の完全な仕様として機能します。 型シグネチャの構文は、インターフェイスおよび抽象クラスの抽象メソッド宣言で使用される構文と同じです。また、IntelliSense および F# インタープリターによって、正しくコンパイルされた入力が表示されるときに fsi.exe も示されます。

型シグネチャに、型がシールされているかどうか、または型がインターフェイス型かどうかを示す十分な情報がない場合は、型の性質を示す属性をコンパイラに追加する必要があります。 この目的で使用する属性については、次の表で説明します。

特性 説明
[<Sealed>] 抽象メンバーがない型、または拡張すべきでない型の場合。
[<Interface>] インターフェイスである型の場合。

属性が実装ファイル内のシグネチャと宣言の間で一貫性がない場合、コンパイラはエラーを生成します。

キーワード val を使用して、値または関数値のシグネチャを作成します。 キーワード type では、型シグネチャが導入されます。

--sig コンパイラ オプションを使用して署名ファイルを生成できます。 一般に、.fsi ファイルは手動で記述しません。 代わりに、コンパイラを使用して .fsi ファイルを生成し、ある場合はプロジェクトに追加し、アクセスできないメソッドと関数を削除して編集します。

型シグネチャにはいくつかの規則があります。

  • 実装ファイル内の型の省略形は、シグネチャ ファイル内の省略形のない型と一致してはなりません。

  • レコードと判別共用体は、フィールドとコンストラクターのすべてまたはすべてを公開する必要があり、シグネチャの順序が実装ファイル内の順序と一致する必要があります。 クラスは、シグネチャ内のフィールドとメソッドの一部、すべて、またはまったく表示できません。

  • コンストラクターを持つクラスと構造体は、基底クラス ( inherits 宣言) の宣言を公開する必要があります。 また、コンストラクターを持つクラスと構造体は、すべての抽象メソッドとインターフェイス宣言を公開する必要があります。

  • インターフェイス型は、すべてのメソッドとインターフェイスを表示する必要があります。

値シグネチャの規則は次のとおりです。

  • アクセシビリティの修飾子 (public、 internalなど) と、シグネチャ内の inline および mutable 修飾子は、実装内のものと一致する必要があります。

  • ジェネリック型パラメーター (暗黙的に推論または明示的に宣言) の数が一致する必要があり、ジェネリック型パラメーターの型制約と型制約が一致する必要があります。

  • Literal属性を使用する場合は、シグネチャと実装の両方に含める必要があり、両方に同じリテラル値を使用する必要があります。

  • シグネチャと実装のパラメーター ( アリティとも呼ばれます) のパターンは一貫している必要があります。

  • シグネチャ ファイル内のパラメーター名が対応する実装ファイルと異なる場合は、代わりに署名ファイル内の名前が使用されるため、デバッグまたはプロファイリング時に問題が発生する可能性があります。 このような不一致の通知を受け取る場合は、プロジェクト ファイルまたはコンパイラの呼び出し時に警告 3218 を有効にします (「--warnon」の「」を参照してください)。

次のコード例は、名前空間、モジュール、関数値、および型シグネチャと適切な属性を持つシグネチャ ファイルの例を示しています。 また、対応する実装ファイルも表示されます。

// Module1.fsi

namespace Library1
  module Module1 =
    val function1 : int -> int
    type Type1 =
        new : unit -> Type1
        member method1 : unit -> unit
        member method2 : unit -> unit

    [<Sealed>]
    type Type2 =
        new : unit -> Type2
        member method1 : unit -> unit
        member method2 : unit -> unit

    [<Interface>]
    type InterfaceType1 =
        abstract member method1 : int -> int
        abstract member method2 : string -> unit

次のコードは、実装ファイルを示しています。

namespace Library1

module Module1 =

    let function1 x = x + 1


    type Type1() =
        member type1.method1() =
            printfn "type1.method1"
        member type1.method2() =
            printfn "type1.method2"


    [<Sealed>]
    type Type2() =
        member type2.method1() =
            printfn "type2.method1"
        member type2.method2() =
            printfn "type2.method2"

    [<Interface>]
    type InterfaceType1 =
        abstract member method1 : int -> int
        abstract member method2 : string -> unit

コンパイラ セマンティック属性

API のコンパイル時コントラクトを保持するには、 .fsi 宣言で以下に示す属性を繰り返します。 F# 11 では、警告ではなく FS3888 エラーが省略されます。すべての.NET属性は必要ありません。

たとえば、 NoDynamicInvocation では、次のインライン関数の非インライン呼び出しパスが禁止されます。 Api.fs 含む:

[<NoDynamicInvocation>]
let inline increment value = value + 1

その Api.fsi には、属性も含まれている必要があります。

[<NoDynamicInvocation>]
val inline increment: value: int -> int

どちらのファイルも module Apiで始まり、最初に署名をコンパイルします。

チェックセットは宣言によって異なります。

宣言 省略を確認した属性
値とメンバー NoDynamicInvocation、 RequiresExplicitTypeArguments、 Conditional、 NoEagerConstraintApplication、 GeneralizableValue、 WarnOnWithoutNullArgument、 CLIEvent、 Extension、 ParamArray、および Literal。
該当する場合は、型とモジュール RequireQualifiedAccess、 NoComparison、 NoEquality、 CustomEquality、 CustomComparison、 ReferenceEquality、 AbstractClass、 Sealed、 CLIMutable、 AllowNullLiteral、 DefaultAugmentation、 ObsoleteCompilerMessage、 Experimental、 Unverifiable、 EditorBrowsable、 AttributeUsage、 IsByRefLike、 IsReadOnly、 Extension、 Measure、 Struct、 Class、および Interface。

このチェックでは、不透明なシグネチャによって隠された型はスキップされますが、モジュールは引き続きチェックされます。 DllImport、SkipLocalsInit、StructuralEquality/StructuralComparison属性などのランタイムのみの属性は、強制セットには含まれません。 FS3888 の場合は、不足しているコントラクト属性を署名に追加します。

レコード署名では、複雑な形状と順序が一致していれば、実装構文とは無関係に 型スプレッド または明示的なフィールドを使用できます。

こちらも参照ください