Nullable双精度的嵌套运行时强制

时间:2017-05-26 11:05:08

标签: f# type-conversion type-coercion

我们说我的价值被定义为一种佣金公式

let address_commission = 1.0 // minimal simplified example

我希望将上述佣金应用到我从DB读取的金额(代码来自我在生产中的窗口WCF服务)

let address_commission = 1.0 // minimal simplified example
new Model.ClaimModel( 
  //RequestRow = i, recounting
  Code = (row.["claim_code"] :?> string), 
  EvtDate = (row.["event_date"] :?> DateTime),
  // skipping lines...
  Amount = (row.["amount"] :?> double) * address_commission,

现在我看到金额汇编很好,但我还需要在下面包含相同的佣金

PrevAmount = (if row.IsNull("prev_amount")  then Nullable()  else  (row.["prev_amount"] :?> Nullable<double>)),

The type 'float' does not match the type 'obj'

以来出错了

因此我也试过

PrevAmount = (if row.IsNull("prev_amount")  then Nullable()  else  (((row.["prev_amount"] :?> double) * address_commission) :?> Nullable<double>)),

但它也因The type 'double' does not have any proper subtypes and cannot be used as the source of a type test or runtime coercion.

而失败

处理此问题的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

:?>是一个动态强制转换,它只在运行时进行检查,所以最好尽量避免它。如果您正在访问数据库,则可以打开open FSharp.Linq.NullableOperators namespace。 (链接已经消失,但它在docs或msdn上的某个地方)。然后,您可以使用?*?和类似的运算符。例如:

let x = System.Nullable<float> 4.
let y = x ?* 3.0
//val y : System.Nullable<float> = 12.0

您可以在任一方或双方都拥有?

你将获得一个Nullable浮动,你可以强制选择 Option.ofNullable(y)或双float y

答案 1 :(得分:1)

我将只使用一种类型强制并将其包裹在Nullable(...)

PrevAmount = (if row.IsNull("prev_amount")  then Nullable()  else  Nullable((row.["prev_amount"]  :?> double) * address_commission)),

它编译并且看起来不错,但如果它们比我的更正确,我仍然会接受不同的答案