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