diff --git a/docs/fsharp/language-reference/compiler-directives.md b/docs/fsharp/language-reference/compiler-directives.md index b467d5339cf6d..6ffff291ca9c2 100644 --- a/docs/fsharp/language-reference/compiler-directives.md +++ b/docs/fsharp/language-reference/compiler-directives.md @@ -52,6 +52,46 @@ let str = "Debugging!" #endif ``` +### Automatically Defined Symbols + +In addition to symbols explicitly defined via project settings or command-line options, **F# projects inherit a set of predefined symbols** based on the SDK, target framework, and build configuration. + +#### Debug, Tracing, and Nullable Settings + +| Symbol | Description | +|-----------|-------------| +| `DEBUG` | Defined in debug builds when compiling with the `Debug` configuration. | +| `TRACE` | Defined when tracing is enabled in the project settings. | +| `NULLABLE` | Defined when `enable` is set in the project file. | + +#### Target Framework Symbols + +| Symbol | Description | +|--------|-------------| +| `NET`, `NETSTANDARD`, `NETCOREAPP` | General indicators of the .NET target type. | +| `NET5_0_OR_GREATER`, `NET6_0_OR_GREATER`, `NET7_0_OR_GREATER` | Defined for specific .NET versions. | +| `NETCOREAPP3_1_OR_GREATER`, `NETCOREAPP2_0_OR_GREATER` | Defined for .NET Core versions. | + +#### Build Configuration Symbols + +| Symbol | Description | +|-----------|-------------| +| `Release` | Defined in release builds. | +| `COMPILED` | Used in compiled projects. | + +For example, you can use these symbols in conditional compilation: + +```fsharp +#if DEBUG +printfn "Debugging mode is enabled." +#else +printfn "Release mode." +#endif +``` + +For a full list of predefined symbols, refer to the official documentation: +[.NET SDK Predefined Compilation Symbols](https://learn.microsoft.com/dotnet/fsharp/tools/fsharp-interactive/#interactive-and-compiled-preprocessor-directives). + ## NULLABLE directive Starting with F# 9, you can enable nullable reference types in the project: