首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当编译器坚持不可能时,如何检查Newtonsoft中的“null”?

问当编译器坚持不可能时,如何检查Newtonsoft中的“null”?
EN

Stack Overflow用户
提问于 2019-05-22 12:46:38
回答 2查看 466关注 0票数 3

我们的项目是将C#和F#与ASP.NET核心混合在一起。ASP.NET核心默认为Newtonsoft,用于在任何地方序列化/反序列化,而swagger文档生成(nswag)也依赖于CLI(可变的)-like DTO来生成正确的类型。

我们的DTO在F#中定义如下:

代码语言:javascript
复制
[<CLIMutable>]
type Query =
    { Status: string
      Offset: int
      Limit: int }

这使得Newtonsoft可以序列化,nswag可以生成swagger文档。

但是..!对于空/选项“不匹配”,我感到非常困难。C#/Newtonsoft/NSwag坚持使用null,并且不理解F#的option。因此在我的F#中,我必须检查空值并将它们转换为选项;在从域转换回DTO时,还必须将我的选项转换回空。

但是F#坚持认为null是不可能的,甚至不允许我检查:编译器给我的是:“类型{.}没有'null‘作为适当的值”。但事实上,运行时是空的,因为Newtonsoft就是这样工作的。Newtonsoft似乎是.NET标准,所以我不认为使用其他东西是可行的。

即使F#认为它不可能为空,我如何检查它是否为空呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-22 13:54:14

克服这一问题的一个简单方法(一般情况下)是在检查null之前将该值装箱。

let isReallyNull value = value |> box |> isNull

然后,您可以在正常逻辑中检查Newtonsoft返回的对象实例:

代码语言:javascript
复制
if dto |> isReallyNull
then None
else Some dto

下面是一个使用Unchecked.defaultof为编译器不能为空的类型生成空值的完整示例:

代码语言:javascript
复制
[<CLIMutable>]
type MyDto =
    {
        Status: string
        Offset: int
        Limit: int
    }

let isReallyNull value = value |> box |> isNull

let dto = Unchecked.defaultof<MyDto>

// if dto |> isNull (* Compiler complains that MyDto does not have null as a proper value *)
if dto |> isReallyNull
then printfn "The DTO is null"
else printfn "The DTO is non-null"
票数 8
EN

Stack Overflow用户

发布于 2019-05-22 19:23:12

代码语言:javascript
复制
let optionalValue = Option.ofObj dto

正如Aaron所建议的,如果dto是一个记录类型,那么您需要这样做:

代码语言:javascript
复制
let optionalValue = dto |> box |> Option.ofObj
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56257157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档