Obsazení a převody (F#)
Toto téma popisuje podporu pro převody typu F#.
Aritmetické typy
F# poskytuje operátory převodu aritmetické převody mezi různými primitivními typy jako mezi typy integer a číslo s plovoucí desetinnou čárkou .Operátory převodu nedílnou a char kontrole a nekontrolované formuláře; operátory číslo s plovoucí desetinnou čárkou a enum nejsou konverze operátor .Nekontrolovaná formulářů jsou definovány v Microsoft.FSharp.Core.Operators a kontrolované formulářů jsou definovány v Microsoft.FSharp.Core.Operators.Checked.Kontrolované formuláře zkontrolovat přetečení a generovat výsledná hodnota překračuje limity cílová databáze typu runtime výjimka .
Každý z těchto operátorů má stejný název jako název cílového typu.Například v následujícím kódu, ve kterém explicitně poznámkami typy, byte se zobrazí se dvě různé významy.První výskyt je typ a druhý je konverze operátor.
let x : int = 5
let b : byte = byte x
Následující tabulka uvádí operátory převodu definované v F#.
Operátor |
Description |
---|---|
byte |
Převeďte na byte, nepodepsané typu 8 bitů. |
sbyte |
Převeďte podepsané byte. |
int16 |
Převeďte podepsané 16bitové integer. |
uint16 |
Převeďte na nepodepsaný 16bitové integer. |
int32, int |
Převeďte podepsané 32bitové integer. |
uint32 |
Převeďte na nepodepsaný 32bitové integer. |
int64 |
Převeďte podepsané 64bitové integer. |
uint64 |
Převeďte na nepodepsaný 64bitové integer. |
nativeint |
Převeďte do nativní integer. |
unativeint |
Převeďte na nepodepsaný nativní integer. |
float, double |
Převeďte 64bitové číslo s dvojitou přesností IEEE číslo s plovoucí desetinnou čárkou . |
float32, single |
Převeďte na 32bitové jednoduchá přesnost IEEE číslo s plovoucí desetinnou čárkou číslo. |
decimal |
Převést na System.Decimal. |
char |
Převést na System.Char, znak Unicode . |
enum |
Převeďte výčtového typu. |
Vedle vestavěné primitivní typy můžete použít tyto operátory s typy, které implementují op_Explicit nebo op_Implicit metod s odpovídajícími podpisy.Například int převodu operátor funguje typu, který obsahuje statickýmetoda op_Explicit , zadejte jako parametr trvá a vrátí int. Jako zvláštní výjimka z obecného pravidla, nelze podle návratový typ přetížení metody lze provést op_Explicit a op_Implicit.
Výčtové typy
enum operátor je obecný operátor , který má jednu zadejte parametr , který představuje typ enum převést na. Převede Výčtový typ, odvození typu proměnné pokusí určit typ enum , kterou chcete převést .V následujícím příkladu proměnná col1 není explicitně poznámkami, ale jeho typ je odvodit z vyšší rovnosti test. Proto kompilátor odvodit převodem do Color výčet. Alternativně můžete zadat typ poznámka, stejně jako col2 v následujícím příkladu.
type Color =
| Red = 1
| Green = 2
| Blue = 3
// The target type of the conversion is determined by type inference.
let col1 = enum 1
// The target type is supplied by a type annotation.
let col2 : Color = enum 2
do
if (col1 = Color.Red) then
printfn "Red"
cílová databázetypvýčet můžete také zadat explicitně jako typ parametr, jako v následujícím kódu:
let col3 = enum<Color> 3
Všimněte si, že výčet vrhá práce, pouze pokud je kompatibilní s typem převáděna nadřízený typ výčet .Následující kód převod nezdaří kompilovat z důvodu neshody mezi int32 a uint32.
// Error: types are incompatible
let col4 : Color = enum 2u
Další informace naleznete v tématu Vyčíslení (F#).
Obsazení typy objektů
Konverze mezi typy v hierarchii objekt je základní objekt-orientované programování.Existují dva základní typy převodů: obsazení nahoru (upcasting) a obsazení dolů (downcasting).Obsazení až hierarchii znamená obsazení z odvozený objektodkazovat se naodkazovat sezákladní objekt. Tato cast je zaručeno pracovat jako základní třída je v hierarchii dědičnosti odvozené třída.Obsazení dolů hierarchii zodkazovat se základní objektodvozený objektodkazovat seúspěšný pouze v případě, že skutečně je objekt instancí typu správné určení (odvozené) nebo typ odvozený z typu cílového.
F# obsahuje operátory pro tyto typy převodů.:> operátor vrhá v hierarchii a :?> operátor vrhá dolů v hierarchii.
Upcasting
V mnoha objekt-orientované jazyky upcasting je implicitní; F# pravidla jsou mírně odlišné.Upcasting automaticky použito při předání argumenty metody typu objekt .Však umožňují mez funkce v modul, upcasting se automaticky, pokud typ parametr je deklarován jako flexibilní typu.Další informace naleznete v tématu Flexibilní typy (F#).
:> operátor provádí statický nádech, což znamená, že úspěch odevzdaných je určena v době kompilovat . Pokud nádech, který používá :> zkompiluje úspěšně, je platný osazení a má možnost selhání v době spuštění.
Můžete také použít upcast operátor takového převodu. Následující výraz Určuje převod v hierarchii.
upcast expression
Při použití operátorpovýšení kompilátor pokusy o odvození typu, který převádíte do kontext.Pokud je kompilátor nelze určit typ cílová databáze , kompilátor ohlásí chyba.
Downcasting
:?> operátor provádí dynamické nádech, což znamená, že úspěch odevzdaných je určena v době spuštění. Nádech, který se používá :?> operátor není zaškrtnuta v době kompilovat ; ale v době spuštění proveden pokus o odevzdaných na zadaný typ.Pokud je kompatibilní s typem cílová databáze objekt , úspěšně tavby.Pokud není kompatibilní s typem cílová databáze objekt , vyvolává runtime InvalidCastException.
Můžete také použít downcast operátor k provedení převodu dynamického typu. Následující výraz Určuje převod dolů v hierarchii na typ, který je odvodit z program kontext.
downcast expression
Pro povýšení operátorPokud kompilátor nelze odvodit konkrétní cílová databáze typ z kontextoznámí chyba.
Následující kód ilustruje použití :> a :?> operátory.Kód ukazuje, že :?> operátor je nejvhodnější, pokud víte, že převod budou úspěšné, protože ji vyvolá InvalidCastException Pokud se převod nezdařil. Pokud nevíte, že převod budou úspěšné, typ test používající match výraz je lepší, protože se vyhýbá režii generuje výjimka.
type Base1() =
abstract member F : unit -> unit
default u.F() =
printfn "F Base1"
type Derived1() =
inherit Base1()
override u.F() =
printfn "F Derived1"
let d1 : Derived1 = Derived1()
// Upcast to Base1.
let base1 = d1 :> Base1
// This might throw an exception, unless
// you are sure that base1 is really a Derived1 object, as
// is the case here.
let derived1 = base1 :?> Derived1
// If you cannot be sure that b1 is a Derived1 object,
// use a type test, as follows:
let downcastBase1 (b1 : Base1) =
match b1 with
| :? Derived1 as derived1 -> derived1.F()
| _ -> ()
downcastBase1 base1
Protože obecné hospodářské subjekty downcast a upcast spoléhat na odvození typu proměnné určit typ argument a návrat do výše uvedený kód, můžete nahradit
let base1 = d1 :> Base1
s
base1 = upcast d1
V předchozím kódu návratové typy a argument typ je Derived1 a Base1, resp..
Další informace o typu zkoušky viz Shoda výrazy (F#).