2015-06-25 54 views
0

作爲在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。

+2

您可以使用匹配版本作爲運算符 –

+0

'let(| ??)= function v當v = Unchecked.defaultof - > System.Stri ng.Empty | v - > v' – Petr

+0

更正您的自定義運算符:'let inline(| ??)x y = match x with null - > y | _ - > x' – Daniel

回答

0

定義一個函數和一個單例活躍模式:

let safeStr = function 
    | null -> String.Empty 
    | x -> x 
let (|SafeStr|) = safeStr 

您現在可以使用的功能:

let myFSharpString = safeStr <| CSharpService.GetCSharpString() 

...或活動模式:

let processCSharpString (SafeStr x) = 
    // x is never null :)