2016-12-27 33 views
4

說我們得到了一個非常簡單的功能的ToString引發的NullReferenceException爲單位值()

let fn a = a.ToString() 

它的類型被推斷爲a -> string 然而,一個單位值傳遞給在一個NullReferenceException作用的結果。

在像上面簡單的功能的情況下,這可能是周圍容易的工作,但我在一個更復雜的情況其實是:

let eitherToHttp e = 
    match e with 
    | Either.Ok v ->  OK (v.ToString()) 
    | Either.Bad reason -> reasonToErrorCode reason 

的類型,這是Either<'a, RejectReason> -> WebPart(什麼WebPartEither實際上是在這裏是不相關的)

e的類型爲Either<unit, RejectReason>的情況下,該函數與簡單場景中的完全相同。

我該如何克服這個問題? 如果實際上這不適用於所有類型,那麼應該將類型推斷爲泛型?

+3

單元在運行時由'null'常量表示,所以自然不能調用它的方法。 –

回答

3

你可以做這樣的事情:

let fn a = match box a with 
      | null -> "" 
      | _ -> a.ToString() 

這編譯爲在a只是一個空檢查然後嘗試撥打ToString

+0

請閱讀我對Mark的回答的評論,以瞭解爲什麼這個被接受。 –

+0

公平地說,你可以內聯他的解決方案,它可能會更好。你可以試試 – Ringil

+0

我剛纔嘗試過。看來,使用'inline'是有點傳染性的。使用它或者使調用'inline'函數的函數也是'inline',或者導致它不是通用的。在我的問題中看看我希望儘可能通用的'eitherToHttp'函數。內聯它似乎不適合我(但也許我錯了)。 –

6

使用內置string函數,而不是調用對象的ToString

> string 42;; 
val it : string = "42" 
> string();; 
val it : string = "" 
+0

我正在移動接受的答案標籤,因爲,另一個答案,雖然不太優雅的產生一個通用的函數,而'字符串'運算符似乎有某種限制,請參閱我的另一個SO問題的詳細信息:http:// stackoverflow .com/questions/41371190/type-in​​ference-on-tostring-vs-string-operator –

相關問題