首先,NULL对于F#类型来说是不允许的值,这在某种意义上是好的,但是由此也带来了麻烦。
第一个需要可能是:忘记所有关于option和NULL的参数,我需要NULL,那是我编程的方式。那么好。你可以使用你允许它为NULL的类型的[<AllowNullLiteral>]特性。
真正走进F#的人们同意使用option是一个更好的选择。然而,这种限制使F#很难和C#程序交流。例如,你想从C#里面使用F#库。你真的能够禁止C#用户设置NULL值进入你的完美世界?或者,你应该吗?我想保持我的世界不受影响且让其他的人继续他们的方式,而不是成为一个编码警察和强迫每个人。我将使用一个属性来筛选传入的NULL到一个option值,公开Null值到外面的世界,且同时,保护我里面的世界避免受到NULL的干扰。
下面的代码使用Unchecked.default函数。不幸的是,在setter函数里面,match不很好地起作用,所以我只使用if….else。
typeA() =
let mutable a:option< A> = None
member this.Value
withget() =
match a with
| Some(n)-> n
| None->Unchecked.defaultof< A >
and set(v) =
if v =Unchecked.defaultof< A >then a <- None
else a <-Some(v)
用这种方法,我可以从我的代码里避免NULL且仍然给C#用户提供很好的C#体验。
如果你真的需要在F#代码里面检查NULL值,通常你可以使用box(你的值),那么box(你的值) = null是可以的。
如果代码编译不过,请移除一些空格,该博客编辑器不能很好的处理F#代码。:(
译文出处: http://apollo13cn.blogspot.com/2012/05/null-value-in-f-and-c.html