2012-03-27 13 views
20

tengo que enumerar los miembros de una colección y crear una matriz con una propiedad particular de los miembros:¿Cómo se escribe el molde en F #?

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

Aquí app.Operations es una colección de IAzOperation sino en la enumeración, devuelve cada miembro como Obj. Entonces quiero escribir cada miembro y acceder a la propiedad. pero no estoy seguro de cómo encasillarlo. Si encasillado la forma en que he mencionado aquí, me da error:

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

Qué me estoy perdiendo aquí?

Respuesta

23

Se necesita el operador downcasting :?>:

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

Como el símbolo ? en su nombre denota, downcasting podría fallar y dar lugar a una excepción de tiempo de ejecución.

En caso de secuencias, usted tiene otra opción de utilizar Seq.cast: Versión

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

Para completar, con coincidencia de patrones [| para :? IAzOperation como op on 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 
Cuestiones relacionadas