在F#中使用可空引用类型

问题描述

在F#中,如果要与另一种.NET语言进行互操作,或者使用AllowNullLiteral属性,则引用类型可以为null。立即想到的示例是字符串:

let str: string = null

但是使用C#8和dotnet核心3,我们可以选择加入Nullable Reference Types。我将不得不像这样用C#编写上述代码

string? str = null;

是否有一种方法也可以选择使用F#中的Nullable引用类型,以便其他语言中定义的类型不能为null,如果可以,则将它们编写为Nullable引用,例如:

let str: string = null // error cannot do this
let str: string? = null

我知道我们可以通过使用选项来转换预期为null的类型:

let str : string = null
let strOpt = Option.ofObj str

我的问题是:是否存在使引用类型nullstring一样不可能,却没有明确声明它在F#中为空的原因? / p>

解决方法

https://www.infoq.com/news/2019/04/FSharp-Nulls/

“ F#当前支持多个版本的可空性。首先是正常的.NET 参考类型。今天,没有办法明确通知编译器是否 特定的引用类型变量是否可以为空,因此不建议在F#中使用它们。“

“首选替代方法是Option。也称为“也许”类型,这是一种类型- 表达可空性概念的安全方法。与惯用的F#代码一起使用时, 仅在检查值是否为非空(F#中不是“ none”)后才能读取该值 用语)。这通常是通过模式匹配完成的。”

但是,是否希望有一种干净的方法可以与这些互操作? F#团队可以识别注释,并且可以here找到可空引用类型的建议。到目前为止,该提案已“原则上已批准”,但尚无原型实现。