2017-05-26 2 views
2

Lassen Sie uns sagen, dass ich einen Wert haben als eine Art Provision Formelverschachtelten Laufzeit Zwang für eine Nullable Doppel

let address_commission = 1.0 // minimal simplified example 

und ich möchte die oben genannten Kommission auf einen Betrag anzuwenden Ich bin von der DB Lesung (der Code aus einem Fenster WCF-Dienst I in der Produktion habe)

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, 

jetzt sehe ich, dass die Menge Linie kompiliert in Ordnung, aber ich brauche auch die gleiche Provision in den folgenden

enthalten

die seit The type 'float' does not match the type 'obj' falsch ist

Deshalb habe ich versucht, auch

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

aber es funktioniert nicht mit The type 'double' does not have any proper subtypes and cannot be used as the source of a type test or runtime coercion.

Was ist der richtige Weg, dies zu umgehen?

+1

Ich denke, ':?> Double' ist falsch und du willst':? double 'was sollte den Fehler beheben, die Sie gedruckt haben –

+0

@JohnPalmer Ich bin mir nicht sicher, aber es scheint nicht das Problem zu sein ... eigentlich jetzt habe ich eine andere Lösung gefunden, indem Sie diesen Teil in eine' Nullable (.. .) ' –

Antwort

2

:?> ist eine dynamische Besetzung und es wird nur zur Laufzeit überprüft, also besser versuchen, es zu vermeiden. Wenn Sie auf Datenbanken zugreifen, hilft es, die open FSharp.Linq.NullableOperatorsnamespace zu öffnen. (Der Link ist für mich gegangen, aber es ist irgendwo in docs oder msdn). Dann können Sie ?*? und ähnliche Operatoren verwenden. Zum Beispiel:

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

können Sie haben ? auf einer oder beiden Seiten.

Sie erhalten einen Nullable-Float zurück, den Sie mit Option.ofNullable(y) oder mit einem Doppel float y zu einer Option erzwingen können.

+0

Ich wusste es nicht und werde das bald versuchen, danke! –

+1

Abgesehen von 'null' ist die fundamentale * dynamische * Besetzung * noch * nötig, wenn ich von DB lese, da sie von' obj' nach 'double' transformieren muss ... oder fehlt mir etwas anderes in deiner Antwort? –

+1

Und zurück zu 'Nullable', muss ich sowieso von' DBNull' konvertieren, es sei denn, ich nutze etwas [functional wrapper] (http://bugsquash.blogspot.it/2010/10/functional-wrapper-over-adonet). html) für DB-Datenzugriff –

1

Ich werde nur eine Art Zwang verwenden und wickeln Sie es in einem Nullable(...)

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

Es kompiliert und sieht für mich in Ordnung, aber ich bin immer noch offen für verschiedene Antworten, wenn sie mehr korrekt sind als meine