次の方法で共有


コンパイラ ディレクティブ

このトピックでは、F# Interactive (dotnet fsi) ディレクティブのコンパイラ ディレクティブについて説明します。F# を使用した 対話型プログラミングを参照してください。

コンパイラ ディレクティブの前に # 記号が付き、それ自体が行に表示されます。

次の表に、F# で使用できるコンパイラ ディレクティブの一覧を示します。

Directive Description
#if if-expression 条件付きコンパイルをサポートします。 #ifに評価される場合は、definedの後のセクションのコードが含まれます (以下を参照)。
#else 条件付きコンパイルをサポートします。 前の #if で使用されたシンボルが definedと評価されない場合に含めるコードのセクションをマークします。
#endif 条件付きコンパイルをサポートします。 コードの条件付きセクションの末尾をマークします。
#[line] int
#[line] intstring
#[行] intverbatim-string
デバッグ用に、元のソース コードの行とファイル名を示します。 この機能は、F# ソース コードを生成するツール用に用意されています。
#nowarn warningcodes 警告コードで指定されている 1 つ以上のコンパイラ 警告を 無効にします (下記参照)。
#warnon warningcodes 警告コードで指定されている 1 つ以上のコンパイラ 警告を 有効にします (以下を参照)。

条件付きコンパイル ディレクティブ

これらのディレクティブのいずれかによって非アクティブにされたコードは、Visual Studio Code エディターで淡色表示になります。

次のコードは、#if ディレクティブ、#else ディレクティブ、および #endif ディレクティブの使用例を示しています。 この例では、function1 の定義の 2 つのバージョンがコードに含まれています。 VERSION1を使用して を定義した場合、#if ディレクティブと #else ディレクティブの間にあるコードがアクティブになります。 それ以外の場合、#else#endif の間にあるコードがアクティブになります。

#if VERSION1
let function1 x y =
   printfn "x: %d y: %d" x y
   x + 2 * y
#else
let function1 x y =
   printfn "x: %d y: %d" x y
   x - 2*y
#endif

let result = function1 10 20

#if ディレクティブは、論理式も受け入れます。

#if SILVERLIGHT || COMPILED && (NETCOREFX || !DEBUG)
#endif

次の式を使用できます。

if-expr 評価
if-expr1 \|\| if-expr2 defined if-expr1またはif-expr2definedのときは。
if-expr1 && if-expr2 defined if-expr1if-expr2definedの場合は。
!if-expr1 defined if-expr1definedしていない場合。
( if-expr1 ) は、 if-expr1 が定義されている場合に定義されます。
symbol defined -define コンパイラ オプションで定義されているフラグが設定されている場合は。

論理演算子には通常の論理的な優先順位があります。

F# に #define コンパイラ ディレクティブはありません。 #if ディレクティブで使用するシンボルを定義するには、コンパイラ オプションまたはプロジェクト設定を使用する必要があります。

条件付きコンパイル ディレクティブは、入れ子にすることができます。 インデントはコンパイラ ディレクティブにとって重要ではありません。

NULLABLE ディレクティブ

F# 9 以降では、プロジェクトで null 許容参照型を有効にすることができます。

<Nullable>enable</Nullable>

これにより、NULLABLE ディレクティブがビルドに自動的に設定されます。 これは、最初に機能をロールアウトするときに、#if NULLABLE ハッシュ ディレクティブによって競合するコードを条件付きで変更する場合に便利です。

#if NULLABLE 
let length (arg: 'T when 'T: not null) =
    Seq.length arg
#else
let length arg =
    match arg with
    | null -> -1
    | s -> Seq.length s
#endif

行ディレクティブ

ビルド時にコンパイラは、各エラーが発生した行番号を参照して、F# コード内のエラーを報告します。 これらの行番号は、ファイル内の最初の行から 1 で始まります。 ただし、別のツールから F# ソース コードを生成している場合、生成されたコードの行番号は、通常、重要ではありません。これは、生成された F# コード内のエラーは、別のソースから発生する可能性が高いためです。 #line ディレクティブを使用すると、F# ソース コードを生成するツールの作成者が、元の行番号およびソース ファイルに関する情報を、生成された F# コードに渡すことができます。

#line ディレクティブを使用する場合、ファイル名を引用符で囲む必要があります。 パスでバックスラッシュ文字を使用するには、文字列の前に逐語的トークン (@) がある場合を除き、バックスラッシュ文字をエスケープする必要があります。エスケープするには、バックスラッシュ文字を 1 つではなく、2 つ使用します。 有効な行トークンを次に示します。 これらの例では、ツールを使用して元のファイル Script1 を実行したときに F# コード ファイルが自動生成され、これらのディレクティブがある位置のコードが Script1 ファイルの 25 行目のトークンから生成されるものと仮定します。

# 25
#line 25
#line 25 "C:\\Projects\\MyProject\\MyProject\\Script1"
#line 25 @"C:\Projects\MyProject\MyProject\Script1"
# 25 @"C:\Projects\MyProject\MyProject\Script1"

これらのトークンは、この場所で生成された F# コードが、25 内の行 Script1 またはその近くにあるなんらかの構成要素から派生したことを示します。

#lineディレクティブは、#nowarn / #warnonの動作に影響しないことに注意してください。 これら 2 つのディレクティブは、コンパイルされるファイルを常に関連付けます。

Warn ディレクティブ

警告ディレクティブは、ソース ファイルの一部に対して指定されたコンパイラ警告を無効または有効にします。

警告ディレクティブは、次で構成されるソース コードの 1 行です。

  • 省略可能な先頭の空白
  • 文字列 #nowarn または #warnon
  • Whitespace
  • 空白で区切られた 1 つ以上 の警告コード (下記参照)
  • 省略可能な空白
  • オプションの行コメント

警告コードは、(警告番号を表す) 一連の数字で、必要に応じてFSで前に付け、必要に応じて二重引用符で囲みます。

#nowarn ディレクティブは、同じ警告番号の#warnon ディレクティブが見つかるまで、またはファイルの末尾まで警告を無効にします。 同様に、 #nowarn ディレクティブは、同じ警告番号の #warnon ディレクティブが見つかるまで、またはファイルの末尾まで警告を無効にします。 このようなペアの前後に、コンパイルの既定値が適用されます。これは次の値です。

  • --nowarn コンパイラ オプション (またはそれぞれの msbuild プロパティ) で無効にした場合は警告なし
  • --warnon コンパイラ オプション (またはそれぞれの msbuild プロパティ) で有効になっていない限り、 オプトイン警告に対する警告はありません

次に例を示します。

module A
match None with None -> ()     // warning
let x =
    #nowarn 25
    match None with None -> 1  // no warning
    #warnon FS25
match None with None -> ()     // warning
#nowarn "FS25" FS007 "42"
match None with None -> ()     // no warning

こちらも参照ください