.net - 在 F# 中强制任何对象为 null

标签 .net types f# option-type

对象可以向任一方向转换,这是不安全的。如何强制任何对象为 null 并在生产代码中使用它们?

例如,在Option<'T> ,我现在可以很容易地有 3 种方法来制作可为空的类型:Some (Unchecked.defaultof<'T>) , Nonenull .

最佳答案

看来您真正想知道的是评论中的这句话:

despite "not having null" it really does have null, for example. objects can be cast in either direction (unsafe)

让我们首先澄清一些 F# 术语:

  • “可空”指的是类型可以直接赋值为空,如写null预期这种类型的地方。 F# 允许此类类型与其他 CLI 语言互操作,具有 Nullable Operators 等功能,或 AllowNullLiteralAttribute . C# 中定义的引用类型通常可以为 null,因此 F# 程序员可以使用使用 null 的 C# 库。

  • “对象”几乎可以指代任何东西,甚至是值类型,除非它们被另外装箱,否则它们不能为 null – 但我很难想象理智的代码处理被分配为 null 的装箱值类型.

因此,将选项称为可空类型不是正确的 F# 术语,因为如果不显式使用不安全函数,则不能将空值分配给它。虽然选项在内部使用 null,但这通常被视为实现细节。

考虑到这一点,你想知道的报价可能指的是分配 null 的能力。 F# 中的任何引用类型,表达式如 Unchecked.defaultof<MyRecordType> .这可以用在 null 无效的位置,有效地绕过更严格的类型,该类型不允许 null 用于普通记录类型。

我认为这是一个相当软弱的批评,因为使用了 Unchecked 中的函数。模块应该提醒程序员他们正在规避安全机制。很少需要这样做,因此这种类型安全性的降低不会导致很多错误。

关于.net - 在 F# 中强制任何对象为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44092863/

相关文章:

c# - ASP.net web api 2 路由属性不工作

.net - 退出痛苦地带 - NDepend

c# - 使用 linq 将共享点列表数据绑定(bind)到下拉列表

c# - 将文件放入 Request.Files

typescript - 为什么 Typescript 接口(interface)允许自引用?

multithreading - 跨线程存储任意函数调用

java - Eclipse(安卓): Cannot be resolved to a type/variable etc

f# - 在 VS2015 中右键单击 .fs 文件可打开 FSI

multithreading - 从异步方法访问记录器对象时死锁同步运行

f# - F# 中的惰性相关矩阵计算