我们说我的价值被定义为一种佣金公式
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.
处理此问题的正确方法是什么?
答案 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)),
它编译并且看起来不错,但如果它们比我的更正确,我仍然会接受不同的答案