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.
Den här artikeln innehåller en tabell som visar hur du anger typen av en literal i F#.
Literaltyper
I följande tabell visas literaltyperna i F#. Tecken som representerar siffror i hexadecimal notation är inte skiftlägeskänsliga. tecken som identifierar typen är skiftlägeskänsliga.
| Typ | Beskrivning | Suffix eller prefix | Exempel |
|---|---|---|---|
| sbyte | signerad 8-bit heltal | y | 86y0b00000101y |
| byte | osignerat 8-bitars naturligt tal | uy | 86uy0b00000101uy |
| int16 | signerat 16-bitars heltal | s | 86s |
| uint16 | osignerat 16-bitars naturligt tal | oss | 86us |
| Int int32 |
signerat 32-bit heltal | l eller ingen | 8686l |
| uint uint32 |
osignerat 32-bitars naturligt tal | u eller ul | 86u86ul |
| nativeint | ** ursprunglig pekare till ett signerat heltal | n | 123n |
| unativeint | inbyggt pekare som ett osignerat naturligt tal | ett | 0x00002D3Fun |
| int64 | Signerad 64 bitars heltal | L | 86L |
| uint64 | osignerat 64-bitars naturligt tal | UL | 86UL |
| enkel, float32 | 32-bitars flyttalsnummer | F eller f |
4.14F eller 4.14f eller infinityf eller -infinityf |
| Lf | 0x00000000lf |
||
| flyta; dubbel | 64-bitars flyttalsnummer | ingen |
4.14 eller 2.3E+32 eller 2.3e+32 eller infinity eller -infinity |
| LF | 0x0000000000000000LF |
||
| bigint | heltal som inte är begränsat till 64-bitars representation | Jag | 9999999999999999999999999999I |
| decimal | bråktal som representeras som en fast punkt eller ett rationellt tal | M eller m |
0.7833M eller 0.7833m |
| Röding | Unicode-tecken | ingen |
'a' eller '\u0061' |
| Sträng | Unicode-sträng | ingen | "text\n"eller @"c:\filename"eller """<book title="Paradise Lost">"""eller "string1" + "string2"Se även Strängar. |
| byte | ASCII-tecken | B | 'a'B |
| byte[] | ASCII-sträng | B | "text"B |
| Sträng eller byte[] | ordagrann sträng | @ prefix |
@"\\server\share" (Unicode)@"\\server\share"B (ASCII) |
Namngivna literaler
Värden som är avsedda att vara konstanter kan markeras med attributet Literal.
Det här attributet leder till att ett värde kompileras som en konstant. I följande exempel är både x och y nedan oföränderliga värden, men x utvärderas vid körning, medan y är en kompileringskonstant.
let x = "a" + "b" // evaluated at run-time
[<Literal>]
let y = "a" + "b" // evaluated at compile-time
Not
Funktioner kan inte användas för att beräkna [<Literal>] värden eftersom literaler måste fastställas vid kompileringstid och inte kan vara beroende av körningsutvärdering.
Varför funktioner inte kan beräkna literaler
Attributet [<Literal>] kräver att värden är kända vid kompileringstid. Funktioner, även om de verkar generera konstanta utdata, utvärderas vid körning, vilket gör dem olämpliga för [<Literal>]. Den här begränsningen säkerställer att literaler kan användas på ett säkert sätt i scenarier som mönstermatchning, attributargument och interop med externa funktioner.
Ett försök att tilldela resultatet av en funktion till en literal misslyckas till exempel:
[<Literal>]
let yFunc() = "a" + "b" // error FS0267: this is not a valid constant expression
Den här skillnaden är också viktig när du anropar en extern funktion. Till exempel är DllImport ett attribut som behöver veta värdet för myDLL under kompilering. Utan [<Literal>]-deklarationen skulle den här koden inte kompilera:
[<Literal>]
let myDLL = "foo.dll"
[<DllImport(myDLL, CallingConvention = CallingConvention.Cdecl)>]
extern void HelloWorld()
I mönstermatchningsuttryck behandlas identifierare som börjar med gemener alltid som variabler som ska bindas, i stället för som literaler, så du bör vanligtvis använda inledande versaler när du definierar literaler.
[<Literal>]
let SomeJson = """{"numbers":[1,2,3,4,5]}"""
[<Literal>]
let Literal1 = "a" + "b"
[<Literal>]
let FileLocation = __SOURCE_DIRECTORY__ + "/" + __SOURCE_FILE__
[<Literal>]
let Literal2 = 1 ||| 64
[<Literal>]
let Literal3 = System.IO.FileAccess.Read ||| System.IO.FileAccess.Write
Exempel på koncis mönstermatchning med namngivna literaler
Namngivna literaler kan göra mönstermatchningen mer koncis genom att undvika behovet av when-satser eller ytterligare logik. Till exempel:
[<Literal>]
let ErrorCode = 404
let handleResponse code =
match code with
| ErrorCode -> "Not Found"
| _ -> "Other Response"
Anmärkningar
Namngivna literaler är användbara för:
- Mönstermatchning utan en
when-sats. - Attributargument.
- Argument för statiska typprovider.
Unicode-strängar kan innehålla explicita kodningar som du kan ange med hjälp av \u följt av en 16-bitars hexadecimal kod (0000 – FFFF) eller UTF-32 en kodningar som du kan ange med hjälp av \U följt av en 32-bitars hexadecimal kod som representerar valfri Unicode-kodpunkt (00000000 – 0010FFFF).
Andra bitoperatorer än ||| tillåts inte.
Heltal i andra baser
Signerade 32-bitars heltal kan också anges i hexadecimalt, oktalt eller binärt med hjälp av ett 0x, 0o eller 0b prefix.
let numbers = (0x9F, 0o77, 0b1010)
// Result: numbers : int * int * int = (159, 63, 10)
Understreck i numeriska literaler
Du kan separera siffror med understreckstecknet (_).
let value = 0xDEAD_BEEF
let valueAsBits = 0b1101_1110_1010_1101_1011_1110_1110_1111
let exampleSSN = 123_45_6789
Särskilda oändlighetsvärden för flyttalspunkter
Både float och single numeriska flyttalstyper har associerade specialvärden som representerar positiv och negativ oändlighet.
| F#-värde | F#-typ | Motsvarande .NET-värde |
|---|---|---|
infinity eller +infinity |
float |
PositiveInfinity |
-infinity |
float |
NegativeInfinity |
infinityf eller +infinityf |
single |
PositiveInfinity |
-infinityf |
single |
NegativeInfinity |
Dessa värden kan användas direkt eller returneras när de divideras med en flyttal noll eller ett tal som är för litet för att representeras av den angivna typen. Till exempel:
> 1.0/0.0;;
val it: float = infinity
> 1.0/(-0.0);;
val it: float = -infinity
> 1.0/0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
;;
val it: float = infinity