ToString为单位值()抛出NullReferenceException

时间:2016-12-27 14:54:48

标签: generics f# type-inference

假设我们有一个非常简单的功能

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>的情况下,函数抛出的方式与简单方案完全相同。

我怎样才能以一种好的方式克服这个问题? 是否应该将类型推断为通用类型,如果实际上这不适用于所有类型?

2 个答案:

答案 0 :(得分:6)

使用内置的string函数,而不是在对象上调用ToString

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

答案 1 :(得分:3)

您可以这样做:

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

在尝试调用a之前,这会在ToString上进行无效检查。