2012-03-27 20 views
20

muszę wyliczyć przez członków kolekcji i utworzyć tablicę z danej nieruchomości członków:Jak wpisać rzut w F #?

let ops: int array = [| for x in app.Operations -> 
          let op= x : IAzOperation 
          op.OperationID |] 

Tutaj app.Operations jest zbiorem IAzOperation ale na wyliczenie, powraca każdego członka jako Obj. Dlatego chcę wpisać rzut każdego członka i uzyskać dostęp do nieruchomości. ale nie wiem, jak to napisać. Gdybym typecast sposób mam tu wspomnieć, że daje mi błąd, że:

This espression was expected to have type IAzOPeration but here has type obj. 

Co ja tu brakuje?

Odpowiedz

23

Trzeba operatora rzutowanie w dół :?>:

let ops: int array = [| for x in app.Operations do 
          let op = x :?> IAzOperation 
          yield op.OperationID |] 

jako symbol ? w nazwie oznacza, rzutowanie w dół może zawodzić i spowodować wyjątek środowiska wykonawczego.

W przypadku sekwencji, masz inną opcję, aby użyć Seq.cast:

let ops: int array = 
    [| for op in app.Operations |> Seq.cast<IAzOperation> -> op.OperationID |] 
+1

Dla kompletności wersję z wzorem pasującym [| dla :? IAzOperation jako op w app.Operations -> op.OperationID |] – desco

10
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