选项类型和可空类型之间有什么区别?

Pet*_*son 12 null f#

在F#mantra中,似乎有一种内心的避免null,Nullable<T>以及它的同类.作为交换,我们应该使用选项类型.说实话,我并没有真正看到差异.

  • 我对F#选项类型的理解是它允许您指定一个可以包含其任何正常值的类型,或者None.例如,除了之外,还Option<int>允许所有int可以拥有的值None.

  • 我对C#可空类型的理解是它允许你指定一个可以包含任何正常值的类型,或者null.例如,Nullable<int>又名int?允许所有的值的int可具有,除了null.

有什么不同?用NullableOption,做一些词汇替换,null并且None,你基本上有相同的东西.有什么大惊小怪的null

Bri*_*ian 20

F#选项是通用的,您可以Option<'T>为任何类型创建'T.

Nullable<T>是一种非常奇怪的类型; 你只能将它应用于结构体,虽然Nullable类型本身就是一个结构体,但它不能应用于它自身.所以你不能创造Nullable<Nullable<int>>,而你可以创造Option<Option<int>>.他们必须做一些框架魔术才能让它发挥作用Nullable.在任何情况下,这意味着对于Nullables,如果类型是类或结构,则必须知道先验,如果它是类,则需要使用null而不是Nullable.这是一个丑陋的漏洞抽象; 它的主要价值似乎是与数据库互操作,因为我认为在数据库域中处理"int或无值"对象是很常见的.

我的意见是,.Net框架只是一个丑陋的混乱,当涉及到null和Nullable.您可以通过拥有Option或者通过建议您避免使用null/Nullable(除非对于互操作绝对必要时除外)并且专注于使用Options的清洁解决方案来证明F#'增加了混乱' .你可以找到有这两种观点的人.

你可能也想看

没有null的语言的最佳解释


Dan*_*iel 6

因为每个.NET引用类型都可以拥有这个额外的,毫无意义的值 - 无论它是否 null,可能存在并且你必须检查它 - 并且因为Nullable使用null它作为"什么都没有"的表示,我认为它会产生很多意识到消除所有那些奇怪的东西(F#所做的)并要求"没有"的可能性是明确的.Option<_>那样做.


Jon*_*rop 6

有什么不同?

F#允许您选择是否希望您的类型为option类型,并且当您这样做时,鼓励您检查NoneNone在类型中显示是否存在.

C#强制允许每个引用类型,null并且不鼓励您检查null.

所以它只是默认值的差异.

用Nullable和Option做一些词汇替换,null和None,你基本上有相同的东西.什么是关于null的大惊小怪?

正如SML,OCaml和Haskell等语言所示,删除null会从实际代码中删除大量的运行时错误.在某种程度上,原始的创造者null甚至将其描述为" 十亿美元的错误 ".