Frage Nullablle <> s und "null" in F #


Ich rufe Funktionen im XNA-Framework von F # auf, die Nullable-Werte akzeptieren. In C # würden Sie jetzt einfach anrufen:

foo(arg1, arg2, null, arg4)

Nun, ich habe das in F # versucht, aber es mag es nicht. Es heißt: "Fehler 9 Typ Constraint nicht übereinstimmen. Der Typ 'a ist nicht kompatibel mit dem Typ System.Nullable Der Typ' System.Nullable 'hat nicht' Null 'als ein richtiger Wert."

Ich verstehe, warum so etwas passiert, aber es scheint wirklich unbequem zu sein. Alles, was ich jetzt mache, ist, das Leben einfacher zu machen, anstatt wiederholt zu tippen (Nullable<Rectangle>)null Jedes Mal, wenn ich die Funktion anrufe, habe ich es getan let nullRect = (Nullable<Rectangle>)null, und verwenden Sie nullRect. Das scheint wirklich blöd zu sein, zumal ich das für jeden NULL-fähigen Typ tun müsste, mit dem ich interagiere. Gibt es eine bessere, idiomatische Art, damit umzugehen?


5
2017-09-02 13:14


Ursprung


Antworten:


Folgendes würde ich tun:

[<GeneralizableValue>]
let nl<'a when 'a : struct
           and 'a : (new : unit -> 'a)
           and 'a :> System.ValueType> : System.Nullable<'a> =
  unbox null

Jetzt können Sie verwenden nl wo auch immer du benutzt hättest null Vor.

BEARBEITEN

Wie Tomas bemerkt, kann dies viel prägnanter geschrieben werden als:

let nl = System.Nullable<_>()

3
2017-09-02 13:23



Wenn Sie die sehr schlaue Antwort von kvb nicht verwenden möchten, können Sie in vielen Fällen den spezifischen Typ weglassen und einfach verwenden Nullable<_>() - F # kann ableiten, welche Art von Nullable du meinst.


3
2017-09-02 15:32