在 F# 咒语中,似乎有一种本能的回避 null
, Nullable<T>
和它的同类。作为交换,我们应该改为使用选项类型。老实说,我真的看不出有什么区别。
None
.例如,一个 Option<int>
允许 int
的所有值可以有,除了None
. null
.例如,Nullable<int>
又名 int?
允许 int
的所有值可以有,除了null
. 有什么不同?用
Nullable
做一些词汇替换和 Option
, null
和 None
,你基本上有同样的事情。有什么好大惊小怪的null
关于?
最佳答案
F#选项一般,可以创建Option<'T>
适用于任何类型 'T
.Nullable<T>
是一种非常奇怪的类型;您只能将其应用于结构体,尽管 Nullable
type 本身就是一个结构体,它不能应用于自身。所以你不能创建 Nullable<Nullable<int>>
,而您可以创建 Option<Option<int>>
.他们必须做一些框架魔术才能使 Nullable
发挥作用。 .无论如何,这意味着对于 Nullables,您必须先验地知道类型是类还是结构,如果是类,则只需要使用 null 而不是 Nullable。这是一个丑陋的泄漏抽象;它的主要值(value)似乎与数据库互操作有关,因为我想在数据库域中处理“int,或无值”对象是很常见的。
我认为,当涉及到 null 和 Nullable
时,.Net 框架只是一团糟。 .您可以通过 Option
来争辩说 F#“增加了困惑”。 ,或者它通过建议您避免使用 null/Nullable
来将您从困惑中解救出来(除非对互操作绝对必要)并通过 Option
专注于干净的解决方案s。你可以找到两种观点的人。
你可能还想看
Best explanation for languages without null
关于f# - 选项类型和可为空类型之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11146825/