Ваша функция cast
не работает как оператор C # as
- если объект не может быть приведен к указанному типу, он выдаст исключение, а не вернет ноль. Следовательно, проверка на то, что italk = null
ничего не дает. Если вы хотите, чтобы функция cast
возвращала ноль при сбое приведения, вместо того, чтобы выдавать исключение, вы можете написать это так:
let cast<'a when 'a : null> o =
match box o with
| :? 'a as output -> output
| _ -> null
Тем не менее, это будет работать только с обнуляемыми типами, которые не включают структуры или (по умолчанию) типы F #. Я мог бы оставить вашу cast
функцию такой, какая она есть, и сделать tryCast
, которая использует опции.
let tryCast<'a> o =
match box o with
| :? 'a as output -> Some output
| _ -> None
Тогда вы можете использовать это так:
ci |> tryCast<ITalk> |> Option.iter (fun it -> it.Talk())
В этом случае Option.iter
занимает место вашего нулевого теста.