2012-03-27 12 views
20

Ich habe durch die Mitglieder einer Sammlung aufzuzählen, und ein Array mit einer bestimmten Eigenschaft der Mitglieder erzeugen:Wie schreibe ich in F # ein?

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

app.Operations Hier ist eine Sammlung von IAzOperation sondern auf Enumeration, kehrt jedes Mitglied als Obj. Also möchte ich jedes Mitglied tippen und auf die Eigenschaft zugreifen. aber nicht sicher, wie man es typisiert. Wenn ich die Art und Weise typisieren ich hier erwähnt habe, gibt es mir, dass Fehler:

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

Was soll ich hier fehlt?

Antwort

23

Sie benötigen die Betreiber Downcasting :?>:

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

Als das Symbol ? in seinem Namen bezeichnet, in einer Laufzeitausnahme einziehe könnte scheitern und führen.

Bei Sequenzen, haben Sie eine andere Option verwenden Seq.cast:

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

Zur Vollständigkeit Version mit Mustervergleich [| zum :? IAzOperation als op in.Operationen -> 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 
Verwandte Themen