Anteckning
Å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.
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