Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Det här avsnittet beskriver kompileringsdirektiv, för F#-interaktiva (dotnet fsi) direktiv, se Interaktiv programmering med F#.
Ett kompilatordirektiv har prefixet #-symbolen och visas på en egen rad.
I följande tabell visas de kompilatordirektiv som är tillgängliga i F#.
| Directive | Description |
|---|---|
#if
if-expression |
Stöder villkorlig kompilering. Kod i avsnittet efter #if inkluderas om if-uttrycket utvärderas till defined (se nedan). |
#else |
Stöder villkorlig kompilering. Markerar ett kodavsnitt som ska inkluderas om symbolen som används med föregående #if inte utvärderas till defined. |
#endif |
Stöder villkorlig kompilering. Markerar slutet på ett villkorsstyrt kodavsnitt. |
#[rad] int,#[rad] int-sträng,#[rad] intverbatim-string |
Anger den ursprungliga källkodsraden och filnamnet för felsökning. Den här funktionen tillhandahålls för verktyg som genererar F#-källkod. |
#nowarn
varningskoder |
Inaktiverar en eller flera kompilatorvarningar enligt varningskoderna (se nedan). |
#warnon
varningskoder |
Aktiverar en eller flera kompilatorvarningar enligt varningskoder ( se nedan). |
Direktiv för villkorlig kompilering
Kod som inaktiveras av något av dessa direktiv visas nedtonad i Visual Studio Code-redigeraren.
Följande kod illustrerar användningen av direktiven #if, #elseoch #endif . I det här exemplet innehåller koden två versioner av definitionen av function1. När VERSION1 definieras med hjälp av kompilatoralternativet -define aktiveras koden mellan #if direktivet och #else direktivet. Annars aktiveras koden mellan #else och #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
Direktivet #if accepterar också logiska uttryck:
#if SILVERLIGHT || COMPILED && (NETCOREFX || !DEBUG)
#endif
Följande uttryck kan användas.
| if-expr | evaluation |
|---|---|
if-expr1 \|\| if-expr2 |
defined om if-expr1 eller if-expr2 är defined. |
if-expr1 && if-expr2 |
defined om if-expr1 och if-expr2 är defined. |
!if-expr1 |
defined om if-expr1 är inte defined. |
( if-expr1 ) |
definieras om if-expr1 har definierats. |
symbol |
defined om den flaggas enligt definitionen i kompilatoralternativet -define . |
De logiska operatorerna har den vanliga logiska prioriteten.
Det finns inget #define kompilatordirektiv i F#. Du måste använda kompilatoralternativet eller projektinställningarna för att definiera de symboler som används av #if direktivet.
Villkorliga kompileringsdirektiv kan kapslas. Indrag är inte signifikant för kompilatordirektiv.
Fördefinierade symboler
F#-kompilatorn och byggsystemet definierar automatiskt flera symboler som kan användas för villkorlig kompilering.
Skapa konfigurationssymboler
Följande symboler definieras baserat på din byggkonfiguration:
-
DEBUG: Definierad vid kompilering i felsökningsläge. I projektsystemet definieras symbolenDEBUGautomatiskt i felsökningskonfigurationen, men inte i versionskonfigurationen. Den här symbolen används ofta med kontroller och diagnostikkod. Mer information finns i Kontroller. -
TRACE: Definierad för versioner som aktiverar spårning. Precis somDEBUGdefinieras den här symbolen vanligtvis i Felsökningskonfigurationer, men kan också aktiveras i Versionskonfigurationer.
Du kan åsidosätta dessa värden med hjälp av kompilatoralternativet-define eller projektinställningarna.
Symboler för kompileringsläge
Följande symboler skiljer mellan olika kompileringslägen:
-
COMPILED: Definieras vid kompilering av kod med F#-kompilatorn. Den här symbolen är användbar när du behöver kod för att bete dig annorlunda i kompilerade sammansättningar jämfört med interaktiva F#-sessioner. -
INTERACTIVE: Definieras vid kompilering eller körning av kod i F# Interactive (dotnet fsi), inklusive både interaktiva sessioner och skriptkörning. På så sätt kan du skriva kod som fungerar annorlunda när du kör interaktivt.
Mer information om hur du använder dessa symboler i skript finns i Interaktiv programmering med F#.
Exempel:
#if INTERACTIVE
// Code specific to F# Interactive
#r "nuget: Newtonsoft.Json"
#endif
#if COMPILED
// Code specific to compiled assemblies
open System.Configuration
#endif
Målramverkssymboler
Byggsystemet definierar även preprocessorsymboler för olika målramverk i SDK-liknande projekt. Dessa symboler är användbara när du skapar bibliotek eller program som riktar sig till flera .NET-versioner.
| Målramverk | Symbols | Ytterligare symboler (finns i .NET 5+ SDK:er) |
Plattformssymboler (endast tillgängliga när du anger en OS-specifik TFM) |
|---|---|---|---|
| .NET Framework |
NETFRAMEWORK, NET481, NET48, NET472, NET471, NET47, NET462, NET461, NET46, , NET452, NET451, NET45, NET40, , NET35NET20 |
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_GREATERNET20_OR_GREATER |
|
| .NET Standard |
NETSTANDARD, NETSTANDARD2_1, NETSTANDARD2_0, NETSTANDARD1_6, NETSTANDARD1_5, NETSTANDARD1_4, , NETSTANDARD1_3, NETSTANDARD1_2, , NETSTANDARD1_1NETSTANDARD1_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_GREATERNETSTANDARD1_0_OR_GREATER |
|
| .NET 5+ (och .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_1NETCOREAPP1_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_GREATERNETCOREAPP1_0_OR_GREATER |
ANDROID, BROWSER, IOS, MACCATALYST, MACOS, , TVOS, , WINDOWS[OS][version] (till exempel IOS15_1),[OS][version]_OR_GREATER (till exempel IOS15_1_OR_GREATER) |
Anmärkning
- Versionslösa symboler definieras oavsett vilken version du riktar in dig på.
- Versionsspecifika symboler definieras endast för den version som du riktar in dig på.
- Symbolerna
<framework>_OR_GREATERdefinieras för den version som du riktar in dig på och alla tidigare versioner. Om du till exempel riktar in dig på .NET Framework 2.0 definieras följande symboler:NET20,NET20_OR_GREATER,NET11_OR_GREATERochNET10_OR_GREATER. - Symbolerna
NETSTANDARD<x>_<y>_OR_GREATERdefinieras endast för .NET Standard-mål och inte för mål som implementerar .NET Standard, till exempel .NET Core och .NET Framework. - Dessa skiljer sig från målramverksmoniker (TFM) som används av MSBuild-egenskapen och NuGet.
Du kan till exempel använda dessa symboler för att villkorligt kompilera kod baserat på målramverket:
#if NET6_0_OR_GREATER
// Use .NET 6+ specific APIs
#else
// Use alternative implementation for older frameworks
#endif
NULLABLE-direktiv
Från och med F# 9 kan du aktivera nullbara referenstyper i projektet:
<Nullable>enable</Nullable>
Detta sätter automatiskt NULLABLE-direktiv för bygget. Det är användbart under den initiala utrullningen av funktionen att ändra kod villkorligt som är i konflikt med #if NULLABLE hash-direktiv.
#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
Linjedirektiv
När du skapar rapporterar kompilatorn fel i F#-kod genom att referera till radnummer där varje fel inträffar. Dessa radnummer börjar vid 1 för den första raden i en fil. Men om du genererar F#-källkod från ett annat verktyg är radnumren i den genererade koden vanligtvis inte av intresse, eftersom felen i den genererade F#-koden troligen uppstår från en annan källa. Direktivet #line tillhandahåller ett sätt för författare av verktyg som genererar F#-källkod att skicka information om de ursprungliga radnumren och källfilerna till den genererade F#-koden.
När du använder #line direktivet måste filnamn omges av citattecken. Om inte den ordagranna token (@) visas framför strängen måste du undvika omvänt snedstreck genom att använda två omvänt snedstreck i stället för ett för att kunna använda dem i sökvägen. Följande är giltiga radtoken. I de här exemplen antar du att den ursprungliga filen Script1 resulterar i en automatiskt genererad F#-kodfil när den körs via ett verktyg och att koden på platsen för dessa direktiv genereras från vissa token på rad 25 i filen Script1.
# 25
#line 25
#line 25 "C:\\Projects\\MyProject\\MyProject\\Script1"
#line 25 @"C:\Projects\MyProject\MyProject\Script1"
# 25 @"C:\Projects\MyProject\MyProject\Script1"
Dessa token anger att F#-koden som genereras på den här platsen härleds från vissa konstruktioner på eller nära rad 25 i Script1.
Observera att #line-direktiv inte påverkar beteendet hos #nowarn / #warnon. Dessa två direktiv relaterar alltid den fil som kompileras.
Varna direktiv
Varna direktiv inaktiverar eller aktiverar angivna kompilatorvarningar för delar av en källfil.
Ett varningsdirektiv är en enda rad med källkod som består av
- Valfritt inledande blanksteg
- Strängen
#nowarneller#warnon - Whitespace
- En eller flera varningskoder (se nedan), avgränsade med blanksteg
- Valfritt tomt utrymme
- Valfri radkommentar
En varningskod är en sekvens med siffror (som representerar varningsnumret), som eventuellt föregås av FS, omgiven av dubbla citattecken.
Ett #nowarn direktiv inaktiverar en varning tills ett #warnon direktiv för samma varningsnummer hittas, eller till slutet av filen. På samma sätt inaktiverar ett #nowarn direktiv en varning tills ett #warnon direktiv för samma varningsnummer hittas, eller annars till slutet av filen. Före och efter sådana par gäller kompileringsstandarden, som är
- ingen varning om det inaktiveras av ett --nowarn-kompilatoralternativ (eller motsvarande msbuild-egenskap)
- ingen varning för opt-in-varningar, om det inte aktiveras av kompilatoralternativet --warnon (eller respektive msbuild-egenskap)
Här är ett (intrikat) exempel.
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