繁体   English   中英

强制F#中的任何对象为null

[英]Force any object to be null in F#

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

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

您似乎真正想知道的是这些评论中的引言:

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

让我们首先阐明一些F#术语:

  • “可为空”是指将类型直接分配为空的能力,例如在期望此类型为null下。 F#允许此类类型与其他CLI语言进行互操作,并具有Nullable OperatorsAllowNullLiteralAttribute之类的功能 C#中定义的引用类型通常可以为空,因此F#程序员可以使用使用null的C#库。

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

因此,将选项称为可空类型不是F#的正确术语,因为在没有显式使用不安全函数的情况下,无法为它分配null。 虽然选项在内部使用null,但通常将其视为实现细节。

考虑到这一点,您想知道的引用可能是指使用诸如Unchecked.defaultof<MyRecordType>表达式为F#中的任何引用类型分配null的功能。 可以在null无效的位置使用它,从而有效地规避了更严格的类型,该类型应禁止正常记录类型使用null。

我认为这是一个相当微弱的批评,因为使用Unchecked模块中的函数应该警告程序员他们正在绕过安全机制。 这样做几乎是没有必要的,因此这种类型安全性的降低不会引起很多错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM