次の方法で共有


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

このトピックでは、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 ディレクティブで使用するシンボルを定義するには、コンパイラ オプションまたはプロジェクト設定を使用する必要があります。

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

定義済みのシンボル

F# コンパイラとビルド システムでは、条件付きコンパイルに使用できる複数のシンボルが自動的に定義されます。

ビルド構成シンボル

ビルド構成に基づいて、次のシンボルが定義されます。

  • DEBUG: デバッグ モードでコンパイルするときに定義されます。 プロジェクト システムでは、 DEBUG シンボルはデバッグ構成で自動的に定義されますが、リリース構成では定義されません。 このシンボルは、アサーションと診断コードで一般的に使用されます。 詳細については、「 アサーション」を参照してください。
  • TRACE: トレースを有効にするビルドに対して定義されます。 DEBUGと同様に、このシンボルは通常、デバッグ構成で定義されますが、リリース構成でも有効にすることができます。

これらの値は、 -define コンパイラ オプション またはプロジェクト設定を使用してオーバーライドできます。

コンパイル モードのシンボル

次の記号は、異なるコンパイル モードを区別します。

  • COMPILED: F# コンパイラを使用してコードをコンパイルするときに定義されます。 このシンボルは、コンパイル済みアセンブリと F# 対話型セッションで動作が異なるコードが必要な場合に便利です。
  • INTERACTIVE: 対話型セッションとスクリプト実行の両方を含む、F# Interactive (dotnet fsi) でコードをコンパイルまたは実行するときに定義されます。 これにより、対話形式で実行するときに動作が異なるコードを記述できます。

スクリプトでこれらのシンボルを使用する方法の詳細については、「F# を使用した 対話型プログラミング」を参照してください。

例:

#if INTERACTIVE
// Code specific to F# Interactive
#r "nuget: Newtonsoft.Json"
#endif

#if COMPILED
// Code specific to compiled assemblies
open System.Configuration
#endif

ターゲット フレームワークシンボル

ビルド システムでは、SDK スタイルのプロジェクトのさまざまなターゲット フレームワークのプリプロセッサ シンボルも定義されます。 これらのシンボルは、複数の .NET バージョンを対象とするライブラリまたはアプリケーションを作成する場合に便利です。

ターゲット フレームワーク シンボル 追加のシンボル
(.NET 5 以降の SDK で使用可能)
プラットフォーム シンボル (使用可能なのは のみ)
OS に特化した TFM を指定する場合にのみ使用可能です。
.NET Framework NETFRAMEWORKNET481NET48NET472NET471NET47NET462NET461NET46NET452NET451NET45NET40NET35NET20 NET48_OR_GREATERNET472_OR_GREATERNET471_OR_GREATERNET47_OR_GREATERNET462_OR_GREATERNET461_OR_GREATERNET46_OR_GREATERNET452_OR_GREATERNET451_OR_GREATERNET45_OR_GREATERNET40_OR_GREATERNET35_OR_GREATERNET20_OR_GREATER
.NET Standard NETSTANDARDNETSTANDARD2_1NETSTANDARD2_0NETSTANDARD1_6NETSTANDARD1_5NETSTANDARD1_4NETSTANDARD1_3NETSTANDARD1_2NETSTANDARD1_1NETSTANDARD1_0 NETSTANDARD2_1_OR_GREATERNETSTANDARD2_0_OR_GREATERNETSTANDARD1_6_OR_GREATERNETSTANDARD1_5_OR_GREATERNETSTANDARD1_4_OR_GREATERNETSTANDARD1_3_OR_GREATERNETSTANDARD1_2_OR_GREATERNETSTANDARD1_1_OR_GREATERNETSTANDARD1_0_OR_GREATER
.NET 5+ (および .NET Core) NETNET10_0NET9_0NET8_0NET7_0NET6_0NET5_0NETCOREAPPNETCOREAPP3_1NETCOREAPP3_0NETCOREAPP2_2NETCOREAPP2_1NETCOREAPP2_0NETCOREAPP1_1NETCOREAPP1_0 NET10_0_OR_GREATERNET9_0_OR_GREATERNET8_0_OR_GREATERNET7_0_OR_GREATERNET6_0_OR_GREATERNET5_0_OR_GREATERNETCOREAPP3_1_OR_GREATERNETCOREAPP3_0_OR_GREATERNETCOREAPP2_2_OR_GREATERNETCOREAPP2_1_OR_GREATERNETCOREAPP2_0_OR_GREATERNETCOREAPP1_1_OR_GREATERNETCOREAPP1_0_OR_GREATER ANDROIDBROWSERIOSMACCATALYSTMACOSTVOSWINDOWS
[OS][version] (例: IOS15_1)、
[OS][version]_OR_GREATER (例: IOS15_1_OR_GREATER)

  • バージョンレスのシンボルは、ターゲットとするバージョンに関係なく定義されます。
  • バージョン固有のシンボルは、対象とするバージョンに対してのみ定義されます。
  • <framework>_OR_GREATER シンボルは、ターゲットとするバージョンとそれ以前のすべてのバージョンに対して定義されます。 たとえば、.NET Framework 2.0 をターゲットとする場合、NET20NET20_OR_GREATERNET11_OR_GREATERNET10_OR_GREATER のシンボルが定義されます。
  • NETSTANDARD<x>_<y>_OR_GREATER シンボルは.NET Standard ターゲットにのみ定義され、.NET Core や .NET Framework などの .NET Standard を実装するターゲットには定義されません。
  • これらは、MSBuild TargetFramework プロパティNuGet で使用されるターゲット フレームワーク モニカー (TFM) とは異なります。

たとえば、次のシンボルを使用して、ターゲット フレームワークに基づいてコードを条件付きでコンパイルできます。

#if NET6_0_OR_GREATER
// Use .NET 6+ specific APIs
#else
// Use alternative implementation for older frameworks
#endif

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

こちらも参照ください