F# 可为Null的double的嵌套运行时强制
假设我有一个定义为佣金公式的值F# 可为Null的double的嵌套运行时强制,f#,type-conversion,type-coercion,F#,Type Conversion,Type Coercion,假设我有一个定义为佣金公式的值 let address_commission = 1.0 // minimal simplified example 我想将上述佣金用于我从DB读取的金额(代码来自我在生产中使用的window WCF服务) 现在,我看到金额行编译得很好,但我还需要在下面的代码中包含相同的佣金 PrevAmount = (if row.IsNull("prev_amount") then Nullable() else (row.["prev_amount"] :?>
let address_commission = 1.0 // minimal simplified example
我想将上述佣金用于我从DB读取的金额(代码来自我在生产中使用的window WCF服务)
现在,我看到金额行编译得很好,但我还需要在下面的代码中包含相同的佣金
PrevAmount = (if row.IsNull("prev_amount") then Nullable() else (row.["prev_amount"] :?> Nullable<double>)),
但是,如果类型“double”没有任何正确的子类型,并且不能用作类型测试或运行时强制的源,则它也会失败。
处理这个问题的正确方法是什么?我将只使用一种类型的强制,并将其包装在一个
可空(…)
它可以编译,在我看来还可以,但如果它们比我的更正确,我仍然愿意接受不同的答案。
:?>
是一个动态强制转换,只在运行时进行检查,所以最好尽量避免。如果要访问数据库,请打开打开FSharp.Linq.NullableOperators
。(我的链接不见了,但它在文档或msdn上的某个地方)。然后可以使用?*?
和类似的运算符。例如:
let x = System.Nullable<float> 4.
let y = x ?* 3.0
//val y : System.Nullable<float> = 12.0
设x=System.Nullable 4。
设y=x?*3.0
//val y:System.Nullable=12.0
您可以在任一侧或两侧安装?
您将得到一个可为空的浮点值,您可以使用它强制一个选项
Option.ofNullable(y)
或双精度float y
我认为:?>双精度是错误的,您想要:?双击
,它将修复您的错误printed@JohnPalmer我不确定,但这似乎不是问题。。。实际上,现在我已经找到了一个不同的解决方案,将该部分包装成一个null(…)
,除了null
,当我从DB读取时,仍然需要基本的动态强制转换,因为它必须从obj
强制转换为double
。。。或者我在你的答案中遗漏了什么?回到Nullable
,无论如何,我必须从DBNull
转换,除非我利用一些数据库数据访问。好的,如果你可以使用一个类型提供程序,例如,它可以为你提取正确的类型,那将是最好的。如果您得到一个obj
,那么是的,您可能需要取消X/cast。我尽量避免使用ADO.net(我认为DBNull来自ADO.net),但似乎FSSql
可以完成一些包装工作。是否有一些WCF/WSDL F#type提供程序?或者您至少可以使用:>
进行静态转换?我还发现了一个有趣的msdn。谢谢你抽出时间!
PrevAmount = (if row.IsNull("prev_amount") then Nullable() else (((row.["prev_amount"] :?> double) * address_commission) :?> Nullable<double>)),
PrevAmount = (if row.IsNull("prev_amount") then Nullable() else Nullable((row.["prev_amount"] :?> double) * address_commission)),
let x = System.Nullable<float> 4.
let y = x ?* 3.0
//val y : System.Nullable<float> = 12.0