对象可以向任一方向转换,这是不安全的。如何强制任何对象为 null 并在生产代码中使用它们?
例如,在Option<'T>
,我现在可以很容易地有 3 种方法来制作可为空的类型:Some (Unchecked.defaultof<'T>)
, None
和 null
.
最佳答案
看来您真正想知道的是评论中的这句话:
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/