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
.