对象可以向任一方向投射,这是不安全的。如何强制任何对象为null并在生产代码中使用它们?
例如,在Option<'T>
中,我现在可以轻松地有3种方法来制作可以为空的类型:Some (Unchecked.defaultof<'T>)
,None
和null
。
答案 0 :(得分:5)
似乎你真正想知道的是评论的这句话:
尽管&#34;没有null&#34;例如,它确实有null。对象可以向任一方向投射(不安全)
让我们首先澄清一些F#术语:
&#34;可空&#34;指的是类型的直接赋值为null的能力,如编写null
时期望此类型。 F#允许此类类型与其他CLI语言互操作,具有Nullable Operators或AllowNullLiteralAttribute等功能。 C#中定义的引用类型通常是可空的,因此F#程序员可以使用使用null的C#库。
&#34;对象&#34;指的是几乎任何东西,甚至是值类型,除非它们是另外的盒装,否则它们都是空的 - 但是我很难想象那些处理被赋值为null的盒装值类型的理智代码。
因此,将选项称为可空类型并不是正确的F#术语,因为如果不明确使用不安全的函数,则无法为其指定null。虽然选项在内部使用null,但这通常被视为实现细节。
考虑到这一点,您想知道的引用可能是指将null
分配给F#中的任何引用类型的能力,其表达式为Unchecked.defaultof<MyRecordType>
。这可以在null无效的位置使用,有效地避免了对于正常记录类型应该禁止null的更严格的类型。
我认为这是一个相当弱的批评,因为使用Unchecked
模块中的函数应警告程序员他们正在绕过安全机制。这样做很少是必要的,因此这种类型安全性的降低不会导致许多错误。