Как отмечали другие, проблема в том, что десериализатор может возвращать null
, но, поскольку вы работаете с типами F #, вы не можете напрямую проверить, является ли значение null
!
Я думаю, что лучший способ - как можно раньше избавиться от значения null
, поступающего из некоторых библиотек .NET, чтобы вы могли сохранить оставшуюся часть кода в чистоте.Вот как я думаю, это можно исправить:
let getMostRecentTaggedResearchReportForSecurityId
(securityId : int) (callbackUI : Action<_>) =
getSingleRPCResult< JSONSingleResult<TaggedResearchReportUIVO>,
TaggedResearchReportUIVO >
"TaggedResearchReportRPC"
"getMostRecentResearchReportForSecurityId"
(sprintf "%i" securityId)
callbackUI
(fun (x : option<JSONSingleResult<TaggedResearchReportUIVO>>) ->
// Note: Return 'Some' only when the result is 'Some' and the 'result'
// value carried inside the discriminated union is not 'null'
match x with
| Some(res) when
// Make sure that there are no dangerous values (I suppose
// JSONSingleResult is imported from .NET and
// TaggedResearchReportUIVO is your F# type.
res <> null && res.result <> Unchecked.defaultOf<_> ->
Some(res.result)
| _ -> None )
Тогда вы можете безопасно использовать сопоставление с шаблоном для работы со значением, потому что оно никогда не будет null
:
member this.setTaggedResearchReportList
(index : int) (taggedResearchReport : TaggedResearchReportUIVO option) =
match taggedResearchReport with
| Some(report) ->
// do some stuff here
| _ -> () // do nothing here
Я бы, вероятно, не использовал AllowNullLiteral
, потому что единственное место, где вы можете решить эту проблему, - это получить результат из библиотеки JSON.Как только вы решите проблему, вы можете безопасно использовать это значение везде в коде F # (без проверки на null
).