このトピックでは、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-expr2がdefinedのときは。 |
if-expr1 && if-expr2 |
defined
if-expr1とif-expr2がdefinedの場合は。 |
!if-expr1 |
defined
if-expr1がdefinedしていない場合。 |
( 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 |
NETFRAMEWORK、 NET481、 NET48、 NET472、 NET471、 NET47、 NET462、 NET461、 NET46、 NET452、 NET451、 NET45、 NET40、 NET35、 NET20 |
NET48_OR_GREATER、 NET472_OR_GREATER、 NET471_OR_GREATER、 NET47_OR_GREATER、 NET462_OR_GREATER、 NET461_OR_GREATER、 NET46_OR_GREATER、 NET452_OR_GREATER、 NET451_OR_GREATER、 NET45_OR_GREATER、 NET40_OR_GREATER、 NET35_OR_GREATER、 NET20_OR_GREATER |
|
| .NET Standard |
NETSTANDARD、NETSTANDARD2_1、NETSTANDARD2_0、NETSTANDARD1_6、NETSTANDARD1_5、NETSTANDARD1_4、NETSTANDARD1_3、NETSTANDARD1_2、NETSTANDARD1_1、NETSTANDARD1_0 |
NETSTANDARD2_1_OR_GREATER、 NETSTANDARD2_0_OR_GREATER、 NETSTANDARD1_6_OR_GREATER、 NETSTANDARD1_5_OR_GREATER、 NETSTANDARD1_4_OR_GREATER、 NETSTANDARD1_3_OR_GREATER、 NETSTANDARD1_2_OR_GREATER、 NETSTANDARD1_1_OR_GREATER、 NETSTANDARD1_0_OR_GREATER |
|
| .NET 5+ (および .NET Core) |
NET、 NET10_0、 NET9_0、 NET8_0、 NET7_0、 NET6_0、 NET5_0、 NETCOREAPP、 NETCOREAPP3_1、 NETCOREAPP3_0、 NETCOREAPP2_2、 NETCOREAPP2_1、 NETCOREAPP2_0、 NETCOREAPP1_1、 NETCOREAPP1_0 |
NET10_0_OR_GREATER、 NET9_0_OR_GREATER、 NET8_0_OR_GREATER、 NET7_0_OR_GREATER、 NET6_0_OR_GREATER、 NET5_0_OR_GREATER、 NETCOREAPP3_1_OR_GREATER、 NETCOREAPP3_0_OR_GREATER、 NETCOREAPP2_2_OR_GREATER、 NETCOREAPP2_1_OR_GREATER、 NETCOREAPP2_0_OR_GREATER、 NETCOREAPP1_1_OR_GREATER、 NETCOREAPP1_0_OR_GREATER |
ANDROID、 BROWSER、 IOS、 MACCATALYST、 MACOS、 TVOS、 WINDOWS、[OS][version] (例: IOS15_1)、[OS][version]_OR_GREATER (例: IOS15_1_OR_GREATER) |
注
- バージョンレスのシンボルは、ターゲットとするバージョンに関係なく定義されます。
- バージョン固有のシンボルは、対象とするバージョンに対してのみ定義されます。
-
<framework>_OR_GREATERシンボルは、ターゲットとするバージョンとそれ以前のすべてのバージョンに対して定義されます。 たとえば、.NET Framework 2.0 をターゲットとする場合、NET20、NET20_OR_GREATER、NET11_OR_GREATER、NET10_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
こちらも参照ください
.NET