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