rae platicar hablar etimologia entre diferencia types f# casting

types - hablar - platicar etimologia



¿Cómo se escribe elenco en F#? (2)

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

Tengo que enumerar a través de los miembros de una colección y crear una matriz con una propiedad particular de los miembros:

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

Aquí app.Operations es una colección de IAzOperation pero 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 enumero el modo que he mencionado aquí, me da error que:

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

¿Que me estoy perdiendo aqui?


Necesita el operador de 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 resultar en una excepción de tiempo de ejecución.

En el caso de las secuencias, tiene otra opción para usar Seq.cast :

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