use*_*185 5 c# f# nullable-reference-types
在 F# 中,如果您要与另一种 .NET 语言进行互操作,或者如果您使用AllowNullLiteral属性,则引用类型可以是null. 马上想到的例子是字符串:
let str: string = null
Run Code Online (Sandbox Code Playgroud)
但是对于 C# 8 和 dotnet core 3,我们可以选择加入Nullable Reference Types。我必须在 C# 中编写上述代码,例如:
string? str = null;
Run Code Online (Sandbox Code Playgroud)
有没有办法在 F# 中选择 Nullable 引用类型,以便其他语言中定义的类型不能是null,如果可以,请将它们写为 Nullable 引用,例如:
let str: string = null // error cannot do this
let str: string? = null
Run Code Online (Sandbox Code Playgroud)
我知道我们可以null通过使用选项来转换可能预期的类型:
let str : string = null
let strOpt = Option.ofObj str
Run Code Online (Sandbox Code Playgroud)
我的问题是:是否有可能在 F# 中没有明确声明它可以为空的情况下创建引用类型null,例如string?
来自https://www.infoq.com/news/2019/04/FSharp-Nulls/,
\n\n\n“F# 目前支持多个版本的可为空性。首先有普通的 .NET\n引用类型。如今,无法明确通知编译器特定的引用类型变量\n是否可为空,因此不鼓励在 F# 中使用它们。”
\n
\n\n“首选替代方案是 Option。也称为 \xe2\x80\x9cmaybe\xe2\x80\x9d 类型,这是表达可空性概念的类型\n安全方式。与惯用的 F# 代码一起使用时,\n可以仅在检查值是否为非空后读取该值(不是 F#\nparlance 中的 \xe2\x80\x9cnone\xe2\x80\x9d)。这通常是通过模式匹配完成的。
\n
但是,是否希望有一种干净的方式与这些进行互操作?注释得到了 F# 团队的认可,可以在此处找到可空引用类型的建议。截至今天,该提案已“原则上获得批准”,但尚无原型实施。
\n