我在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。这看起来真的很愚蠢,特别是因为我必须为我与之交互的每个可空类型执行此操作。是否有更好,更惯用的方式来处理这个问题?
答案 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是什么类型。