f# type-conversion type-coercion

f# - coerción de tiempo de ejecución anidada para un doble Nullable



type-conversion type-coercion (2)

Digamos que tengo un valor definido como una especie de fórmula de comisión

let address_commission = 1.0 // minimal simplified example

y quiero aplicar la comisión mencionada anteriormente a una cantidad que estoy leyendo de la base de datos (el código es de un servicio WCF de ventana que tengo en producción)

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,

ahora veo que la línea de cantidad compila bien, pero también necesito incluir la misma comisión en el siguiente

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

lo cual es incorrecto ya que The type ''float'' does not match the type ''obj''

Por lo tanto, he intentado también

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

pero también falla. The type ''double'' does not have any proper subtypes and cannot be used as the source of a type test or runtime coercion.

¿Cuál es la forma correcta de manejar esto?


Voy a usar solo un tipo de coerción y envolverlo dentro de un Nullable(...)

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

Compila y se ve bien para mí, pero todavía estoy abierto a diferentes respuestas si son más correctas que las mías


:?> es un elenco dinámico y solo se verifica en el tiempo de ejecución, así que mejor intente evitarlo. Si está accediendo a bases de datos, ayuda a abrir el espacio de nombres open FSharp.Linq.NullableOperators . (El enlace se ha ido para mí, pero está en algún lugar en documentos o msdn). Entonces puedes usar ?*? y operadores similares. Por ejemplo:

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

Puedes tener ? en uno o ambos lados.

Obtendrá de regreso un flotante con anulación que puede forzar a una opción con Option.ofNullable(y) o con un doble float y .