记录可以有一个可以为空的字段吗?

时间:2014-05-05 05:32:57

标签: f#

记录是否合法具有可以为空的字段,例如:

type MyRec = { startDate : System.Nullable<DateTime>; }

这个例子确实构建在我的项目中,但如果它是合法的,那么这是一个好的做法,如果有什么问题会引入?

2 个答案:

答案 0 :(得分:7)

这是合法的,但F#鼓励使用选项类型:

type MyRec = { startDate : option<DateTime>; }

通过使用选项,您可以轻松地对选项和其他操作进行模式匹配,以转换选项值,例如地图值(使用Option.map)和抽象,例如Maybe monad(使用Option.bind ),由于只有价值类型可以成为无效的,因此可以使用可空。

您会注意到大多数F#函数(例如List.choose)使用选项而不是nullables。某些语言功能(如optional parameters)被解释为F#选项类型。

但是在某些情况下,当您需要与C#进行交互时,您可能希望使用Nullable。

当使用Linq查询数据库时,您可以考虑使用Linq.Nullable ModuleNullable operators

答案 1 :(得分:3)

F#不允许在F#中声明的类型为null。但是,如果您使用的是未在F#中定义的类型,则仍允许使用null。这就是您的代码仍然合法的原因。这是互操作性所必需的,因为您可能需要将null传递给.NET库或作为结果接受它。

但我要说这不是一个好习惯,除非你的需要特别是互操作性。正如其他人指出的那样,您可以使用选项功能。但是,这不会创建可选的记录字段,其值在创建时不需要指定。要创建记录类型的值,您仍需要提供可选字段的值。

此外,您可以使用AllowNullLiteral属性标记类型,并且F#编译器将允许null作为该特定类型的值,即使它是在F#中声明的类型。但是AllowNullLiteral不能应用于记录类型。

哦,我差点忘了提及:选项类型与可空类型不兼容。我天真地希望工作的东西(愚蠢的我!)。有关详细信息,请参阅this nice SO discussion