作爲在F#中重寫我的C#代碼的一部分,我遇到了我不知道如何最好地處理從C#服務返回的System.String類型的默認值的情況。正確地將C#默認字符串賦值給F#變量
的C#相當於我想要做什麼是:
var myCSharpString = CSharpService.GetCSharpString() ?? "";
簡單地說,如果GetCSharpString返回的字符串爲空或默認值(字符串),我想它被設置爲「 「而是。
但是,如果我嘗試在F#中執行以下語句,會發生什麼?
let myFSharpString = CSharpService.GetCSharpString
在GetCSharpString返回null或默認(串)的情況下,將myFSharpString是一個字符串F#中的默認值(即:「「)?或者將我必須明確地做一個空檢查,如:
let myFSharpString =
match CSharpService.GetCSharpString with
| val when val = Unchecked.defaultof<System.String> -> ""
| val -> val
我發現自己做的檢查,如這幾次,我根本無法過多少代碼的事實得到的是需要這樣的一個簡單的任務。
有人能夠啓發我這樣的空檢查實際上是否需要在F#中處理返回System.String的C#服務?
更新:
我不是問了?? - 運營商與F#的選項類型的組合,已經在this後前回答。而是我問如何處理F#上下文中的C#空值字符串。
另一個看似可能answer我都試過了,是使一個自定義操作,如:
let inline (|??) (a: 'a Nullable) b = if a.HasValue then a.Value else b
然而,這給出了一個編譯錯誤,因爲F#解釋GetCSharpString的返回值類型的'string',它在F#中是NotNullable。
您可以使用匹配版本作爲運算符 –
'let(| ??)= function v當v = Unchecked.defaultof - > System.Stri ng.Empty | v - > v' –
Petr
更正您的自定義運算符:'let inline(| ??)x y = match x with null - > y | _ - > x' – Daniel