Aracılığıyla paylaş


Ç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.

Dd233220.collapse_all(tr-tr,VS.110).gifYukarı ç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.

Dd233220.collapse_all(tr-tr,VS.110).gifDowncasting

:?> 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#).

Ayrıca bkz.

Diğer Kaynaklar

F# dil başvurusu