gpt4 book ai didi

F# 中的 NullReferenceException

转载 作者:行者123 更新时间:2023-12-05 08:15:42 28 4
gpt4 key购买 nike

当我单步执行以下代码时,第二行的 report 为空。但是,第三行生成 NullReferenceException。

member this.setTaggedResearchReportList (index : int) (taggedResearchReport : TaggedResearchReportUIVO option) =
let report = Option.get(taggedResearchReport)
if not(report.Equals(null)) then
// do some stuff here

为什么会这样,我该怎么做才能避免这种情况?谢谢!

稍后添加:

这是调用 this.setTaggedResearchReportList 的行:

getMostRecentTaggedResearchReportForSecurityId (item.id) (new Action<_>(this.setTaggedResearchReportList 0))

这是 getMostRecentTaggedResearchReportForSecurityId 方法:

let getMostRecentTaggedResearchReportForSecurityId (securityId : int) (callbackUI : Action<_>) =
getSingleRPCResult<JSONSingleResult<TaggedResearchReportUIVO>, TaggedResearchReportUIVO>
"TaggedResearchReportRPC"
"getMostRecentResearchReportForSecurityId"
(sprintf "%i" securityId)
callbackUI
(fun (x : option<JSONSingleResult<TaggedResearchReportUIVO>>) ->
match x.IsSome with
| true -> Some(Option.get(x).result)
| false -> None
)

最佳答案

这本身并不是一个答案,而是添加到空值处理的讨论中,特别是在与 C# 代码互操作时:我喜欢避免使用 [<AllowNullLiteral>]属性并定义如下模块以隔离 null 的使用在 F# 代码中。

[<AutoOpen>]
module Interop =

let inline isNull value = System.Object.ReferenceEquals(value, null)
let inline nil<'T> = Unchecked.defaultof<'T>
let inline safeUnbox value = if isNull value then nil else unbox value
let (|Null|_|) value = if isNull value then Some() else None

type Foo() = class end

type Test() =
member this.AcceptFoo(foo:Foo) = //passed from C#
if isNull foo then nullArg "foo"
else ...

member this.AcceptFoo2(foo:Foo) = //passed from C#
match foo with
| Null -> nullArg "foo"
| _ -> ...

member this.AcceptBoxedFoo(boxedFoo:obj) =
let foo : Foo = safeUnbox boxedFoo
...

member this.ReturnFoo() : Foo = //returning to C#
if (test) then new Foo()
else nil

一般来说,让这些检查尽可能靠近您的 API 接口(interface),您通常可以忘记 null在 F# 中,由于保留了编译器的 null 检查。

关于F# 中的 NullReferenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5462398/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com