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 |]