Çevrim ve dönüşümleri (F#)
Bu konuda Tür Dönüşümleri F# desteğini açıklar.
Aritmetik türleri
F# dönüştürme işleçleri için çeşitli İlkel türler arasında aritmetik dönüştürmeleri gibi tamsayı ve kayan nokta türleri arasında sağlar. İntegral ve karakter dönüştürme işleçleri denetlediyseniz ve denetlenmeyen formları; kayan nokta operatörler ve enum dönüştürme işleç yapın. Denetlenmeyen formları tanımlanan Microsoft.FSharp.Core.Operators işaretlenmiş formları tanımlanır ve Microsoft.FSharp.Core.Operators.Checked. Checked formları taşma durumunu denetleyin ve sonuçta ortaya çıkan değeri hedef türü sınırlarını aşarsa bir çalışma zamanı özel durum oluşturur.
Bu operatörler her hedef türünün adı olarak aynı ada sahip. Hangi türleri açıkça işaretiyle, örneğin, aşağıdaki kodda, byte ile iki farklı anlamları belirir. İlk olayın türü ve ikinci dönüştürme işleç.
let x : int = 5
let b : byte = byte x
Aşağıdaki tabloda tanımlanan F# dönüştürme işleçleri gösterir.
İşleç |
Description |
---|---|
byte |
bayt, 8-bit işaretsiz türüne dönüştürün. |
sbyte |
İmzalı baytdönüştürün. |
int16 |
Bir 16 bitlik imzalı tamsayıdönüştürür. |
uint16 |
Bir 16 bitlik imzalanmamış tamsayıdönüştürür. |
int32, int |
Bir 32 bitlik imzalı tamsayıdönüştürür. |
uint32 |
Bir 32 bitlik imzalanmamış tamsayıdönüştürür. |
int64 |
İçin bir 64 bitlik imzalı tamsayıdönüştürür. |
uint64 |
İçin bir 64 bitlik imzalanmamış tamsayıdönüştürür. |
nativeint |
yereltamsayıdönüştürür. |
unativeint |
tamsayıimzalanmamış yerelbir sayıya dönüştürün. |
float, double |
64-Bit çift duyarlıklı IEEE kayan nokta sayıya dönüştürün. |
float32, single |
32 Bitlik tek duyarlıklı IEEE kayan nokta bir sayıya dönüştürün. |
decimal |
Dönüştürmek System.Decimal. |
char |
Dönüştürmek System.Char, Unicode karakteri. |
enum |
Numaralandırılmış bir türe dönüştürmek. |
Yerleşik temel türlerin yanı sıra bu operatörler uygulayan türü ile kullanabilirsiniz op_Explicit veya op_Implicit yöntemleri uygun imzalara sahip. Örneğin, int dönüştürme işleç statikbiryöntem sağlayan herhangi bir türü ile çalışırop_Explicit türü parametre olarak alır ve verir int. Bir özel özel durum yöntemleri dönüş türüne göre aşırı yüklenemez Genel kural, bunun op_Explicit ve op_Implicit.
Numaralanmýþ türleri
enumİs işleç birini alır genel bir işleç türünü temsil eden parametre yazın enum dönüştürmek . Numaralandırılmış bir türe dönüştürür, tür çıkarımı türünü belirlemek için girişimde enum dönüştürmek istediğiniz. Aşağıdaki örnekte, değişken col1 açıkça işaretiyle değil, ancak sonraki eşitlik testgelen türünü algılanır. derleyici türe dönüþtürüyorsanýz bu nedenle olmadan bir Color sabit listesi. Alternatif olarak, tür ek açıklamasağlamak olduğu gibi col2 aşağıdaki örnekte.
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"
Ayrıca hedef sabit listesi türünü açıkça bir tür parametre, aşağıdaki kodda olduğu gibi belirtebilirsiniz:
let col3 = enum<Color> 3
sabit listesi sabit listesi türlerinin dönüştürülen türle uyumlu ise, iş çevirir unutmayın. Aşağıdaki kodda, dönüştürme derlemek arasında uyumsuzluk nedeniyle başarısız int32 ve uint32.
// Error: types are incompatible
let col4 : Color = enum 2u
Daha fazla bilgi için bkz. Numaralandırma (F#).
Nesne türleri çevrim
nesne sýradüzeni içindeki türleri arasında dönüşüm temel nesne-yönelimli programlama. Dönüşümleri iki temel türü vardır: (yukarı çevrim) çevrim ve çevrim (downcasting). Bir hiyerarşi yukarı çevrim temel nesne başvurusu türetilen nesne referansı arasında çevrim anlamına gelir. Böyle bir cast temel sınıf türetilmiş bir sınıfDevralma hiyerarşisinde olduğu sürece bir çözüm sağlanır. Yalnızca nesne gerçekten bir örneği (türetilmiş) doğru hedef veya hedef türünden türetilmiş bir tür ise bir türetilen nesne başvurusu için bir temel nesne başvurudan bir hiyerarşi aşağı çevrim başarılı olur.
F# bu türde dönüştürme işleçleri sağlar. :> işleç hiyerarþisinin çevirir ve :?> işleç hiyerarşisinde aşağıya çevirir.
Yukarı çevrim
Birçok nesne-yönelimli dil yukarı çevrim örtülü; F# kuralları biraz farklıdır. Bir nesne türüne yöntemlere bağımsız değişken geçirdiğinizde yukarı çevrim otomatik olarak uygulanır. parametre türü esnek bir tür olarak bildirilir ancak modüllet ilişkili işlevler için yukarı çevrim otomatik, olmaz. Daha fazla bilgi için bkz. Esnek türleri (F#).
:> işleç . Kullanan bir oyuncu, :> başarıyla derler geçerli cast olduğundan ve çalışma zamanında hata yok olma olasılığı vardır.
Ayrıca upcastbu tür bir dönüşümü gerçekleştirmek için işleç . Aşağıdaki deyimi hiyerarşi dönüştürmesini belirler.
upcast expression
Başvurmanıza işleçkullandığınızda, bağlamdönüştürüyorsanız o tür gerçekleştirip derleyici çalışır. derleyici hedef türü belirleyemiyor, derleyici bir hatabildirir.
Downcasting
:?> işleç . Kullanan bir dönüþtürme :?> işleç derlemek zamanında; işaretli Ancak, çalışma zamanında belirtilen tür atama yapmak için bir girişimde bulunulmaz. nesne hedef türle uyumlu ise, cast işlemi başarıyla tamamlanır. nesne hedef türü ile uyumlu değilse, çalışma zamanı harekete geçiren bir InvalidCastException.
Ayrıca downcastdinamik türü dönüştürme gerçekleştirmek için işleç . Aşağıdaki ifade, hiyerarşi aşağı program bağlamolayla türüne dönüştürme belirtir.
downcast expression
derleyici bağlambelirli hedef türünden gösterilemez, başvurmanıza işleçolarak, bir hatabildirir.
Aşağıdaki kodu kullanımını göstermektedir :> ve :?> operators. Kod, göstermektedir :?> işleç yaratmaz, çünkü dönüştürme başarılı olduğunu, bildiğiniz, en iyi şekilde kullanılır InvalidCastException dönüştürme başarısız olursa. Dönüştürme başarılı olur, kullandığı bir tür test bilmiyorsanız, bir match ifadesi bir özel durumoluşturma yükünü önler olduğundan daha iyi.
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
Çünkü genel işleçleri downcast ve upcast bağımsız değişken ve dönüş türü yukarıdaki kodu belirlemek için tür çıkarımı güvenir, değiştirmek için
let base1 = d1 :> Base1
ile
base1 = upcast d1
Önceki kodda bağımsız değişken türü ve dönüş türleri olan Derived1 ve Base1, sırasıyla.
Tür sınama hakkında daha fazla bilgi için bkz: Eþleþme deyimleriyle (F#).