Как набирать текст в F #?
Мне нужно перечислить элементы коллекции и создать массив с определенным свойством членов:
let ops: int array = [| for x in app.Operations ->
let op= x : IAzOperation
op.OperationID |]
Здесь app.Operations
представляет собой набор IAzOperation, но при перечислении возвращает каждый элемент как Obj
. Поэтому я хочу набирать каждого участника и получать доступ к нему. но не уверен, как это сделать.
Если я придумаю то, как я упоминал здесь, это дает мне ошибку:
This espression was expected to have type IAzOPeration but here has type obj.
Что мне здесь не хватает?
Ответы
Ответ 1
Вам нужен оператор downtinging :?>
:
let ops: int array = [| for x in app.Operations do
let op = x :?> IAzOperation
yield op.OperationID |]
Поскольку символ ?
в его названии обозначает, downcasting может завершиться ошибкой и привести к исключению во время выполнения.
В случае последовательностей у вас есть другой вариант использования Seq.cast:
let ops: int array =
[| for op in app.Operations |> Seq.cast<IAzOperation> -> op.OperationID |]
Ответ 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