F#中的Nullablle<>和'null'

时间:2010-09-02 13:14:39

标签: f#

我在FNA的XNA框架中调用接受Nullable值的函数。现在,在C#中,您只需调用:

foo(arg1, arg2, null, arg4)

现在,我在F#中试过了,但它并不喜欢它。它说:“错误9类型约束不匹配。类型'a与类型System.Nullable不兼容类型'System.Nullable'没有'null'作为正确的值。”

我明白为什么会发生这种情况,但似乎真的很不方便。我现在所做的就是,为了让生活更轻松,而不是每次调用函数时重复键入(Nullable<Rectangle>)null,我只做了let nullRect = (Nullable<Rectangle>)null,并使用nullRect。这看起来真的很愚蠢,特别是因为我必须为我与之交互的每个可空类型执行此操作。是否有更好,更惯用的方式来处理这个问题?

2 个答案:

答案 0 :(得分:3)

这就是我要做的事情:

[<GeneralizableValue>]
let nl<'a when 'a : struct
           and 'a : (new : unit -> 'a)
           and 'a :> System.ValueType> : System.Nullable<'a> =
  unbox null

现在,您可以使用nl之前使用null的地方。

修改

正如Tomas所说,这可以更简洁地写成:

let nl = System.Nullable<_>()

答案 1 :(得分:3)

如果您不想使用kvb非常聪明的答案,在许多情况下您可以省略特定类型并只使用Nullable<_>() - F#可以推断您的Nullable是什么类型。