【问题标题】:Force any object to be null in F#在 F# 中强制任何对象为空
【发布时间】:2017-10-20 22:20:09
【问题描述】:

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

例如,在 Option<'T> 中,我现在可以轻松地通过 3 种方法来创建可空类型:Some (Unchecked.defaultof<'T>)Nonenull

【问题讨论】:

  • 你能提供更多的上下文吗?你想在这里做什么?您将如何在代码中使用生成的 null? “物体可以向任一方向投射”到底是什么意思?
  • @TheQuickBrownFox 一位 OCamler 对我说 F#“一个无法使用的坏类型系统”,并准确引用了“对象系统已损坏并且与语言的其余部分不匹配。尽管“没有 null “例如,它确实有 null。对象可以在任一方向上投射(不安全)”。你能解释一下他的意思吗?
  • 这对我来说就像他在谈论支持 c# interop 的所有东西,这需要 F# 也有 null。但这并不意味着使用它是一个好主意。
  • 可能一直在谈论向上转换和向下转换。 F# 确实有一个编译时安全向上转换运算符 :>,但它也允许您使用 :?> 运算符尝试不安全向下转换,这可能会引发异常。但是对于不安全的强制转换,您通常会使用类型测试模式进行模式匹配,:?
  • OCamlers 对 F# 的评价持保留态度,他们可能对整个事情有点酸;)

标签: .net types f# optional


【解决方案1】:

看来你真正想知道的是来自 cmets 的这句话:

例如,尽管“没有 null”,但它确实有 null。对象可以向任一方向投射(不安全)

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

  • “Nullable”是指一个类型可以直接赋值为 null,就像写 null 一样,这里需要这种类型。 F# 允许此类类型与其他 CLI 语言互操作,具有 Nullable OperatorsAllowNullLiteralAttribute 等功能。 C# 中定义的引用类型通常可以为空,因此 F# 程序员可以使用使用 null 的 C# 库。

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

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

考虑到这一点,您想知道的引用可能是指将null 分配给F# 中的任何引用类型的能力,使用诸如Unchecked.defaultof<MyRecordType> 之类的表达式。这可以用在 null 无效的位置,有效地规避了更严格的类型,该类型应该不允许 null 用于普通记录类型。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    相关资源
    最近更新 更多